0896-单调数列

Raphael Liu Lv10

如果数组是单调递增或单调递减的,那么它是 单调

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false

示例 1:

**输入:** nums = [1,2,2,3]
**输出:** true

示例 2:

**输入:** nums = [6,5,4,4]
**输出:** true

示例 3:

**输入:** nums = [1,3,2]
**输出:** false

提示:

  • 1 <= nums.length <= 105
  • -105 <= nums[i] <= 105

方法一:两次遍历

遍历两次数组,分别判断其是否为单调递增或单调递减。

代码

[sol1-C++]
1
2
3
4
5
6
class Solution {
public:
bool isMonotonic(vector<int>& nums) {
return is_sorted(nums.begin(), nums.end()) || is_sorted(nums.rbegin(), nums.rend());
}
};
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public boolean isMonotonic(int[] nums) {
return isSorted(nums, true) || isSorted(nums, false);
}

public boolean isSorted(int[] nums, boolean increasing) {
int n = nums.length;
if (increasing) {
for (int i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
return false;
}
}
} else {
for (int i = 0; i < n - 1; ++i) {
if (nums[i] < nums[i + 1]) {
return false;
}
}
}
return true;
}
}
[sol1-Golang]
1
2
3
func isMonotonic(nums []int) bool {
return sort.IntsAreSorted(nums) || sort.IsSorted(sort.Reverse(sort.IntSlice(nums)))
}
[sol1-JavaScript]
1
2
3
4
5
6
7
var isMonotonic = function(nums) {
return isSorted(nums) || isSorted(nums.reverse());
};

function isSorted(nums) {
return nums.slice(1).every((item, i) => nums[i] <= item)
}
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool isSorted(int* nums, int numsSize, bool increasing) {
if (increasing) {
for (int i = 0; i < numsSize - 1; ++i) {
if (nums[i] > nums[i + 1]) {
return false;
}
}
} else {
for (int i = 0; i < numsSize - 1; ++i) {
if (nums[i] < nums[i + 1]) {
return false;
}
}
}
return true;
}

bool isMonotonic(int* nums, int numsSize) {
return isSorted(nums, numsSize, true) || isSorted(nums, numsSize, false);
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(1)。

方法二:一次遍历

遍历数组 nums,若既遇到了 nums}[i]>\textit{nums}[i+1] 又遇到了 nums}[i’]<\textit{nums}[i’+1],则说明 nums 既不是单调递增的,也不是单调递减的。

代码

[sol2-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
bool isMonotonic(vector<int>& nums) {
bool inc = true, dec = true;
int n = nums.size();
for (int i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
inc = false;
}
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}
};
[sol2-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public boolean isMonotonic(int[] nums) {
boolean inc = true, dec = true;
int n = nums.length;
for (int i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
inc = false;
}
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}
}
[sol2-Golang]
1
2
3
4
5
6
7
8
9
10
11
12
func isMonotonic(nums []int) bool {
inc, dec := true, true
for i := 0; i < len(nums)-1; i++ {
if nums[i] > nums[i+1] {
inc = false
}
if nums[i] < nums[i+1] {
dec = false
}
}
return inc || dec
}
[sol2-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
var isMonotonic = function(nums) {
let inc = true, dec = true;
const n = nums.length;
for (let i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
inc = false;
}
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
};
[sol2-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
bool isMonotonic(int* nums, int numsSize) {
bool inc = true, dec = true;
int n = numsSize;
for (int i = 0; i < n - 1; ++i) {
if (nums[i] > nums[i + 1]) {
inc = false;
}
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(1)。

 Comments
On this page
0896-单调数列