题目简述
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
当给定的数组 A 是单调数组时返回 true,否则返回 false。
示例 1:
输入:[1,2,2,3]
输出:true
示例 2:
输入:[6,5,4,4]
输出:true
示例 3:
输入:[1,3,2]
输出:false
示例4:
输入:[1,2,4,5]
输出:true
示例5:
输入:[1,1,1]
输出:true
提示
- 1 <= A.length <= 50000
- -100000 <= A[i] <= 100000
题目分析
很简单的一道题,可以遍历两遍,一次判断是否是递增,一次判断是否是递减,也可以直接遍历一次,设置一个flag判断数列是增数列还是减数列。代码如下:
class Solution {
public:
bool isMonotonic(vector<int>& A) {
int flag=2; //0是递增,1是递减
for(int i=0;i<A.size()-1;i++){
if(A[i]<A[i+1]&&flag==2)flag=0;
if(A[i]>A[i+1]&&flag==0)return false;
if(A[i]>A[i+1])flag=1;
if(A[i]<A[i+1]&&flag==1)return false;
}
return true;
}
};
在看评论区时发现了一个非常绝妙的方法,代码如下:
class Solution {
public:
bool isMonotonic(vector<int>& A) {
int lon=A.size();
if(lon==1) return true;
int a=0,b=0;
for(int i=0;i<lon-1;i++){
if(A[i]<A[i+1]) a=1; //前面比后面小,a=1
if(A[i]>A[i+1]) b=1; //前面比后面大,b=1
}
if(a+b==2) return false; //a和b都等于1,说明有问题
else return true;
}
};
越简单的题就越不能局限于如何成功提交,而是要想办法用更加巧妙的方法来解决问题。大家如果有什么更为巧妙的方法可以发到评论区供大家学习。