LeetCode896 .单调数列 1ms 100%
不要问为什么这么快,问就是代码写得好。空间换来的
题目描述
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
当给定的数组 A 是单调数组时返回 true,否则返回 false。
思路:
- 先根据前两个不相同的数判断是单调性。比如数组
1,1,3,8,5
,根据前两个不同的数1,3
得出这个数组必须是单调增 - 判断剩余元素是否符合
步骤1
得到的单调性
代码
class Solution {
public boolean isMonotonic(int[] A) {
if(A.length==1) return true;
// 是降序吗
boolean isDesc=false;
int second = 1;
while(second<A.length&&A[second]==A[second-1]){
second++;
}
if(second==A.length||second+1==A.length) return true;
if(A[second]<A[second-1]){
isDesc = true;
}
if(isDesc){
for (int i = second+1; i < A.length; i++) {
if(A[i]>A[i-1]){
return false;
}
}
}else {
for (int i = second + 1; i < A.length; i++) {
if (A[i] < A[i - 1]) {
return false;
}
}
}
return true;
}
}
本想用lamda优化下代码结果如下
上帝为你开一扇窗,也会为你关一道门。果然这个世界都是互补的啊
class Solution {
public boolean isMonotonic(int[] A) {
if(A.length==1) return true;
// 是降序吗
BiFunction<Integer, Integer,Boolean> func = (a,b)-> b<=a;
int second = 1;
while(second<A.length&&A[second]==A[second-1]){
second++;
}
if(second==A.length||second+1==A.length) return true;
if(A[second]<A[second-1]){
func = (a,b)-> b>=a;
}
for (int i = second+1; i < A.length; i++) {
if(!func.apply(A[i],A[i-1])){
return false;
}
}
return true;
}
}