如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 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
拿到手感觉,嗯,蛮简单的题,然后很快写好了递增和递减的部分,然后就一直困惑怎么样将两部分组合到一起,尤其是等于的情况,到底划归给哪一部分。最后的考虑是:将A按递增验证一遍,再按照递减验证一遍,只要有一遍成功那就是单调序列。
int upMonotonic(vector<int>& A)
{
int upflag=0;
for(int i=1;i<A.size();i++)
{
if(A[i-1]<=A[i])
{
upflag=1;
}
else
{
upflag=0;
break;
}
}
return upflag;
}
int downMonotonic(vector<int>& A)
{
int downflag=0;
for(int i=1;i<A.size();i++)
{
if(A[i-1]>=A[i])
{
downflag=1;
}
else
{
downflag=0;
break;
}
}
return downflag;
}
class Solution {
public:
bool isMonotonic(vector<int>& A)
{
if((upMonotonic(A)==1)||(downMonotonic(A)==1))
return true;
else if(A.size()==1)
return true;
else
return false;
}
};
补充一段大佬的舶来品代码。其实思路是一致的,人家更简单,我也考虑过逆向写,只不过写的很笨。
class Solution {
public:
bool isMonotonic(vector<int>& A) {
bool inc = true, dec = true;
int n = A.size();
REP(i,0,n-1) {
if (A[i] > A[i+1]) inc = false;
if (A[i] < A[i+1]) dec = false;
}
return inc || dec;
}
};