1. 程式人生 > >166、單調數列

166、單調數列

題目描述
如果陣列是單調遞增或單調遞減的,那麼它是單調的。

如果對於所有 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

程式碼:

class Solution {
    public boolean isMonotonic(int[] A) {
     if(A.length == 1 || A.length == 0){
			return true;
		}
		
		//假定預設是遞減的
		boolean isminus = true;
        //判斷第一個數字和第二個數字是遞減還是遞增
		int i;
		for (i = 0; i < A.length - 1; i++) {
			int j = A[i];
			if(j > A[i + 1]){
				break;
			}else if (j < A[i + 1]) {
				isminus = false;
				break;
			}else {
				continue;
			}
		}
		if(i == A.length - 1){
			return true;
		}
		for ( ; i < A.length - 1; i++) {
			int j = A[i];
			if(j < A[i + 1] && isminus){
				return false;
				
			}
			if(j > A[i + 1] && !isminus){
				return false;
			}
			
		}
		return true;   
    }
}

我覺得肯定是可以優化的
比如:

class Solution {
    public boolean isMonotonic(int[] A) {
     
		if(A.length == 1 || A.length == 0){
			return true;
		}
		//預設是沒有的
		int index = 0;
		//預設是下降的
		boolean isminus = true;
		for (int i = 0; i < A.length - 1; i++) {
			int j = A[i];
			if(index == 0 && j < A[i + 1]){
				isminus = false;
				//已經在前面有了判斷
				index = 1;
                    continue;
			}
			if(index == 0 && j > A[i + 1]){
				isminus = true;
				//已經在前面有了判斷
				index = 1;
                continue;
			}
			if(isminus && j < A[i + 1]){
				return false;
			}
			if(!isminus && j > A[i + 1]){
				return false;
			}
			
    }
    return true;   }
}

放在一個for迴圈裡面了
效能提高不少了
這效率

但是這個程式碼還是比較簡潔啊,不得不說還是比較厲害,通過計算二者的差來進行判斷,厲害厲害

class Solution {
    public boolean isMonotonic(int[] A) {
        int len = A.length;
        if(len == 1) return true;
        int lastDiff = A[1] - A[0];
        for(int i = 2; i < len; i++) {
            int newDiff = A[i] - A[i - 1];
            if(newDiff == 0) continue;
            if(newDiff * lastDiff < 0) return false;
            lastDiff = newDiff;
        }
        
        return true;
    }
}