1. 程式人生 > >896. Monotonic Array - Easy

896. Monotonic Array - Easy

1-1 all lse clas 時間 返回 solution 基礎 smon

An array is monotonic if it is either monotone increasing or monotone decreasing.

An array A is monotone increasing if for all i <= j, A[i] <= A[j]. An array A is monotone decreasing if for all i <= j, A[i] >= A[j].

Return true if and only if the given array A is monotonic.

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. 1 <= A.length <= 50000
  2. -100000 <= A[i] <= 100000

M1: two pass

一開始試圖在one pass判斷兩種單調狀態,但無法處理 {1, 1, 0}這樣的情況,必須得two pass分別判斷是單調增還是單調減,再把結果取或。需要遍歷兩次數組,不是最優。

時間:O(N),空間:O(1)

class Solution {
    public boolean isMonotonic(int[] A) {
        return increasing(A) || decreasing(A);
    }
    private boolean increasing(int[] A) {
        for(int i = 0; i + 2 < A.length; i++) {
            if(A[i] <= A[i+1]) {
                if(A[i+1] > A[i+2])
                    
return false; } else return false; } return true; } private boolean decreasing(int[] A) { for(int i = 0; i + 2 < A.length; i++) { if(A[i] >= A[i+1]) { if(A[i+1] < A[i+2]) return false; } else return false; } return true; } }

M2: one pass

在M1的基礎上,用兩個boolean變量表示增還是減。先把兩個值都初始化為true。如果有元素遞減,increase=false;如果有元素遞增,decrease=false。最後返回increase或decrease

時間:O(N),空間:O(1)

class Solution {
    public boolean isMonotonic(int[] A) {
        if(A.length == 1) return true;
        boolean increasing = true;
        boolean decreasing = true;
        for(int i = 0; i + 1 < A.length; i++) {
            if(A[i] < A[i+1])
                decreasing = false;
            if(A[i] > A[i+1])
                increasing = false;
        }
        return increasing || decreasing;
    }
}

896. Monotonic Array - Easy