
21. 山峰数组的峰顶索引
题目描述
给定一个长度为 n 的山峰数组,满足以下条件:
- arr.length >= 3
- 存在 i (0 < i < arr.length - 1) 使得:
- arr[0] < arr[1] < ... < arr[i-1] < arr[i]
- arr[i] > arr[i+1] > ... > arr[arr.length - 1]
找出任意一个满足条件的索引 i。
题目示例

输入:arr = [0,1,0] 输出:1

输入:arr = [0,2,1,0] 输出:1
解法(二分查找)
算法思路
这道题的核心在于利用山峰数组的单调性。观察数据特点可以发现明显的二段性:
- 上升阶段:左侧元素小于右侧元素(arr[mid] < arr[mid + 1]),说明峰值在 mid 右侧。
- 下降阶段:左侧元素大于等于右侧元素(arr[mid] >= arr[mid + 1]),说明峰值在 mid 或其左侧。
基于此,我们可以将搜索区间不断缩小。这里需要注意边界处理,特别是当 mid 计算偏向左侧或右侧时,判断条件需相应调整以避免死循环。
C++ 算法代码
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
// 区间划分:[ 小于峰值 ], [ 大于等于峰值 ](相当于查找左端点)
int left = 0;
int right = arr.size();
while(left < right) {
int mid = left + (right - left) / ;
(arr[mid] < arr[mid + ]) {
left = mid + ;
} {
right = mid;
}
}
left;
}
};






