21. 山峰数组的峰顶索引
题目描述

题目示例

解法:二分查找
思路分析
观察山峰数组的特性,峰顶位置满足 arr[i] > arr[i-1] && arr[i] > arr[i+1]。其左侧呈上升趋势(arr[i] < arr[i+1]),右侧呈下降趋势(arr[i] > arr[i+1])。这种单调性变化构成了典型的'二段性',非常适合用二分查找来定位转折点。
具体策略如下:
- 若
mid位置的值小于mid+1位置的值,说明处于上升阶段,峰顶在右侧,调整左边界。 - 若
mid位置的值大于mid+1位置的值,说明处于下降阶段或已是峰顶,调整右边界。
C++ 实现
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0;
int right = arr.size();
while(left < right) {
// 向上取整防止死循环,当 left + 1 == right 时 mid = right
int mid = left + (right - left + 1) / 2;
// 判断 mid 是否处于上升段
if(arr[mid - 1] < arr[mid]) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
};






