QUESTION:
Given an array A
of integers, return true
if and only if it is a valid mountain array.
Recall that A is a mountain array if and only if:
-
A.length >= 3
-
There exists some
i
with
0 < i < A.length - 1
such that:
A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[B.length - 1]
Example 1:
Input: [2,1]
Output: false
Example 2:
Input: [3,5,5]
Output: false
Example 3:
Input: [0,3,2,1]
Output: true
Note:
0 <= A.length <= 10000
0 <= A[i] <= 10000
EXPLANATION:
我的解决办法并不是特别的好,我的思路是
1.首先肯定是升序排列的,我们先顶一个order = false来标记为升序
2.如果碰到降序的地方,那么就标记为true。
3.如果在降序的过程中,又发现了升序的操作,那么就有2个峰值,直接返回false
上述算法漏掉了两个特殊的情况,那就是,连续升序和连续降序的情况,这种情况就需要单独拿出来处理。
4.如果第一开始不是升序,或者最后不是降序,那么就同样返回false
看了最后的提交结果后,发现其实有更加容易的解决办法。
SOLUTION:
public static boolean validMountainArray(int[] A) {
if(A.length<3) return false;
boolean order = false;
int tmp = A[0];
for(int i = 1;i<A.length-1;i++){
if(A[i]==tmp) return false;
if(order&&A[i]>=tmp) return false;
else if(!order && A[i]<tmp){
order = true;
}
tmp = A[i];
}
if(A[1]<A[0] || A[A.length-1]>A[A.length-2]) return false;
return order;
}
//比较容易理解的解法
public boolean validMountainArray(int[] A) {
int left = 0, right = A.length - 1;
while(left + 1 < A.length && A[left] < A[left + 1]){
left++;
}
while(right > 0 && A[right] < A[right - 1]){
right--;
}
return left > 0 && left == right && right < A.length - 1;
}