题目
思路
使用二分查找来定位峰顶
对于中间元素,比较它与其右侧元素的大小:
- 如果 arr[mid] < arr[mid+1],说明我们在上坡阶段,峰顶在右侧
- 如果 arr[mid] > arr[mid+1],说明我们在下坡阶段,峰顶在左侧或当前位置
不断缩小搜索范围,直到 left == right,此时指向的就是峰顶位置
时间复杂度和空间复杂度
时间复杂度:O(log n),符合题目要求
空间复杂度:O(1)
正确的写法
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0;
int right = arr.size()-1;
while(left < right)
{
int mid = left + (right-left)/2;
if(arr[mid] < arr[mid+1])
{
left = mid+1;
}
else if(arr[mid] > arr[mid+1])
{
right = mid;
}
}
return left;
}
};