如果数组是单调递增或单调递减的,那么它是 单调 的。
如果对于所有 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
思路
首先,函数检查nums
的长度是否小于或等于2,如果是,那么就直接返回true
,因为长度小于或等于2的数组总是单调的。
然后,函数使用一个迭代器it1
遍历nums
的每一个元素(从第一个元素开始)。在每次循环中,计算当前元素和下一个元素的差diff
,如果diff
不为0,那么就停止循环。
如果遍历完所有元素都没有找到非零的diff
,那么就返回true
,表示nums
是单调的。
然后,函数检查diff
的符号。如果diff
大于0,那么就使用一个循环遍历nums
的每一个元素,如果当前元素小于前一个元素,那么就返回false
,因为这个数组不是递增的。如果diff
小于0,那么就使用一个循环遍历nums
的每一个元素,如果当前元素大于前一个元素,那么就返回false
,因为这个数组不是递减的。
如果遍历完所有元素都没有返回false
,那么就返回true
,表示nums
是单调的。
AC代码
cpp
/*
* @lc app=leetcode.cn id=896 lang=cpp
*
* [896] 单调数列
*/
// @lc code=start
class Solution {
public:
bool isMonotonic(vector<int>& nums) {
if (nums.size() <= 2) {
return true;
}
auto it1 = nums.begin();
int diff = *(it1 + 1) - *it1;
while (it1 != nums.end() - 2 && !diff) {
it1++;
diff = *(it1 + 1) - *it1;
}
if (!diff) {
return true;
}
int tmp = nums.front();
if (diff > 0) {
for (const int i : nums) {
if (i < tmp) {
return false;
}
tmp = i;
}
} else {
for (const int i : nums) {
if (i > tmp) {
return false;
}
tmp = i;
}
}
return true;
}
};
// @lc code=end