题目描述
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 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;
}
}