有序数组,先考虑二分。二分的过程要分为三种情况讨论:
- 当前元素同时大于左右两侧的元素,则当前元素就是山峰;
- 当前元素大于左侧元素,说明在山峰左侧,还在爬升的过程中,将
left
指向mid + 1
; - 当前元素小于等于左侧元素,说明在山峰右侧,将
right
指向mid - 1
。
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 1, right = arr.size() - 2;
while (left <= right)
{
int mid = (left + right) >> 1;
if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]) //到达山峰
{
return mid;
}
if (arr[mid] > arr[mid - 1]) //山峰左侧
{
left = mid + 1;
}
else //山峰右侧
{
right = mid - 1;
}
}
return -1;
}
};