我们把符合下列属性的数组 A
称作山脉:
A.length >= 3
- 存在
0 < i < A.length - 1
使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
的 i
的值。
示例 1:
输入:[0,1,0]
输出:1
示例 2:
输入:[0,2,1,0]
输出:1
提示:
3 <= A.length <= 10000
- 0 <= A[i] <= 10^6
- A 是如上定义的山脉
思路一:遍历得出下数组中最大的数,并返回其下标。
代码:
class Solution {
public int peakIndexInMountainArray(int[] A) {
int max = A[0];
int a = -1;
for(int i = 1; i < A.length; i++){
if(A[i] > max) {
max = A[i];
a = i;
}
}
return a;
}
}
思路二:利用二分的思想,从 0 到 A.length - 1 遍历并判断:如果得出的 mid 中位数的值大于左边的数,而小于右边的数,就将区间变为 mid ~ A.length-1,不然的话就是在 0 ~ mid 中继续找,知道找到 mid 的值大于前一个数和后一个数。
代码:
class Solution {
public int peakIndexInMountainArray(int[] A) {
return find(0, A.length-1, A);
}
private int find( int i, int j, int[] A ){
int mid = (i+j)/2;
if( A[mid-1] < A[mid] && A[mid] < A[mid+1]){
return find(mid, j, A);
}else if( A[mid-1] < A[mid] && A[mid] > A[mid+1] ){
return mid;
}else{
return find(i, mid, A);
}
}
}