
21. 山峰数组的峰顶索引
题目描述
给定一个长度为 n 的山脉数组 arr,其中存在某个索引 i (0 < i < n - 1) 使得:
- arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
- arr[i] > arr[i + 1] > ... > arr[n - 1]
请返回满足条件的任意峰顶索引。
题目示例


解题思路
要找到峰顶,关键在于识别数组的单调性变化。山脉数组具有明显的二段性特征:
- 上升阶段:左侧元素小于右侧元素(arr[mid] < arr[mid + 1])
- 下降阶段:左侧元素大于右侧元素(arr[mid] > arr[mid + 1])
利用这个特性,我们可以用二分查找来定位转折点。如果中间值处于上升阶段,说明峰顶在右侧;如果处于下降阶段或就是峰顶本身,则峰顶在左侧(包含 mid)。
这里提供两种常见的二分写法,核心都是缩小搜索区间直到 left == right。
参考实现(C++)
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
// 区间划分:[ 小于峰值 ], [ 大于等于峰值 ](相当于查找左端点)
int left = 0;
int right = arr.size();
while(left < right) {
int mid = left + (right - left) / 2;
// 对于偶数而言 mid 始终是在左边,所以判断条件是 arr[mid] < arr[mid + 1]
(arr[mid] < arr[mid + ]) {
left = mid + ;
} {
right = mid;
}
}
left;
}
};






