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

题目示例:

解法(二分查找):
算法思路:
分析峰顶位置的数据特点,以及山峰两旁的数据的特点:
- 峰顶数据特点:arr[i] > arr[i - 1] && arr[i] > arr[i + 1]
- 峰顶左边的数据特点:arr[i] > arr[i - 1] && arr[i] < arr[i + 1],也就是呈上升趋势
- 峰顶右边数据的特点:arr[i] < arr[i - 1] && arr[i] > arr[i + 1],也就是呈下降趋势
因此,我们可以分为以下两种情况:
- 如果 mid 位置的值小于 mid-1 位置的值 left=mid;
- 如果 mid 位置的值大于 mid-1 位置的值 right=mid-1;
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;
}
};






