我们把符合下列属性的数组 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 是如上定义的山脉
思路
其实就是找整个数组最大值,但是由于存在一定顺序,所以可以二分查找
性能分析
时间复杂度O(logN),空间复杂度O(1)
具体代码
class Solution {
public int peakIndexInMountainArray(int[] A) {
//赋初值
int left = 0;
int right = A.length - 1;
int mid = (left + right) / 2;
//二分查找
while(left < right){
mid = (left + right) / 2;
//在左侧上升坡,则left右移
if(A[mid] < A[mid + 1]){
left = mid + 1;
}
//在右侧下降坡,则right左移
else{
right = mid;
}
}
//此时left = right = 最终结果
return left;
}
}