如果数组是单调递增或单调递减的,那么它是 单调 的 。
如果对于所有 i <= j
,nums[i] <= nums[j]
,那么数组 nums
是单调递增的。 如果对于所有 i <= j
,nums[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); }
|
复杂度分析
方法二:一次遍历
遍历数组 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; }
|
复杂度分析