LeetCode 941 有效的山脉数组
问题描述:
给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。
让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:
- A.length >= 3
- 在 0 < i < A.length - 1 条件下,存在 i 使得:
- A[0] < A[1] < ... A[i-1] < A[i]
- A[i] > A[i+1] > ... > A[A.length - 1]
中心扩散
- 由当前遍历位置向两边扩散,验证该位置是否为峰顶
class Solution {
public boolean validMountainArray(int[] A) {
if(A==null || A.length<3) {
return false;
}
//中心扩散法O(N2)
for(int i=1; i<A.length-1; i++) {
if(A[i-1]<A[i] && A[i]>A[i+1]) {
if(centerToSides(A, i)) {
return true;
}
}
}
return false;
}
public boolean centerToSides(int[] A, int center) {
int left = center-1, right = center+1;
while(left>=0 || right<A.length) {
if((left>=0 && A[left]>=A[left+1]) ||
(right<A.length && A[right-1]<=A[right])) {
return false;
}
left--;
right++;
}
return left<0 && right>=A.length;
}
}
一次遍历:使用状态标志
class Solution {
public boolean validMountainArray(int[] A) {
if(A==null || A.length==0) {
return false;
}
boolean isRise = false;
int peakCount = 0;
for(int curr=1; curr<A.length; curr++) {
//下降变上升
if(!isRise && A[curr-1]<A[curr]) {
//不是在一开始上升
if(curr-1>0) {
return false;
}
//System.out.println("上升处: "+(curr-1));
isRise = !isRise;
peakCount++;
//超过两个山峰则返回false
if(peakCount>1) {
//System.out.println("返回处: "+"if(peakCount>1)");
return false;
}
}
//上升变下降
else if(isRise && A[curr-1]>A[curr]) {
//System.out.println("下降处: "+(curr-1));
isRise = !isRise;
}
else if(A[curr-1]==A[curr]) {
//System.out.println("返回处: "+"else {");
return false;
}
}
//System.out.println("返回处: "+"return peakCount==1;");
return peakCount==1 && !isRise;
}
}