166、單調數列
阿新 • • 發佈:2019-01-08
題目描述
如果陣列是單調遞增或單調遞減的,那麼它是單調的。
如果對於所有 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;
}
}