问题:
给定数组,判断若为单调增(A[i]>=A[i-1])或者单调减(A[i]<=A[i-1])数组,则返回true,否则返回false。
Example 1: Input: [1,2,2,3] Output: true Example 2: Input: [6,5,4,4] Output: true Example 3: Input: [1,3,2] Output: false Example 4: Input: [1,2,4,5] Output: true Example 5: Input: [1,1,1] Output: true Note: 1 <= A.length <= 50000 -100000 <= A[i] <= 100000
解法1:
设置flag记录数组整体趋势allincre
和当前的趋势curincre
若二者不同,则返回false,否则一直到最后,则返回true
趋势算法:
a==pre?0:(a-pre)/abs(a-pre);
当前数值a和上一个数组pre之差,除以差的绝对值。
==0则为水平
==-1则为单调递减
==1则为单调递增
代码参考:
1 class Solution { 2 public: 3 bool isMonotonic(vector<int>& A) { 4 int allincre = 0; 5 int pre=A[0]; 6 for(int a:A){ 7 int curincre=a==pre?0:(a-pre)/abs(a-pre); 8 if(allincre==0)allincre=curincre; 9 else if(curincre!=0 && allincre!=curincre) return false; 10 pre=a; 11 } 12 return true; 13 } 14 };
解法2:
设置两个flag:
incre:true单调递增,false出现递减
decre:true单调递减,false出现递增
初始化二者皆为true
遍历数组,最后若其中一个出现false(反趋势),则返回false
代码参考:
1 class Solution { 2 public: 3 bool isMonotonic(vector<int>& A) { 4 bool incre = true, decre = true; 5 for(int i=1; i<A.size(); i++){ 6 incre&=A[i]>=A[i-1];//出现一个decre则变为false 7 decre&=A[i]<=A[i-1];//出现一个incre则变为false 8 } 9 return incre||decre; 10 } 11 };