解题思路(更容易理解的做法):
1.如果数组长度小于3,返回false
2.遍历数组,找到至高点
3.如果至高点的左边存在后一个元素小于等于前一个元素的情况,则返回false
4.如果至高点的右边存在后一个元素大于等于前一个元素的情况,则返回false
5.循环结束,返回true
代码实现:
class Solution {
public boolean validMountainArray(int[] A) {
int len=A.length;
if(len<3){
return false;
}
int max=A[0];
int index=0;
//找至高点
for(int i=0;i<len;++i){
if(max<A[i]){
max=A[i];
index=i;
}
}
if(index==0||index==len-1){
return false;
}
for(int i=1;i<len;++i){
if(i<index&&A[i]<=A[i-1]){//至高点的左边
return false;
}
if(i>index&&A[i]>=A[i-1]){//至高点的右边
return false;
}
}
return true;
}
}
解题思路(更直观的做法):
flag=1:递增
flag=2:到达至高点
1.len<3时,返回false
2.没有递增,直接递减时,返回false
3.先递增,在递增的情况下遇到相等时,则返回false
4.到达至高点时又遇到相等或更大的数,则返回false
5.在1 2 3 4都不成立的情况下,找到至高点则返回true,反之返回false
代码实现:
class Solution {
public boolean validMountainArray(int[] A) {
int len=A.length;
if(len<3){
return false;
}
int flag=0;
for(int i=1;i<len;++i){
if(flag==0&&A[i]<=A[i-1]){//没有递增,直接递减时,返回false
return false;
}
if(flag==0&&A[i]>A[i-1]){//先增
flag=1;
continue;
}
if(flag==1&&A[i]==A[i-1]){//在递增的情况下遇到相等时,则返回false
return false;
}
if(flag==1&&A[i]<A[i-1]){//到达至高点
flag=2;
continue;
}
if(flag==2&&A[i]>=A[i-1]){//到达至高点时又遇到相等或更大的数,则返回false
return false;
}
}
if(flag==2){//找到至高点
return true;
}
return true;
}
}