896. Monotonic Array

问题:

给定数组,判断若为单调增(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 };

 

上一篇:Android 安装日志


下一篇:第37月第15天 iPhone 11 414*896