21. 山峰数组的峰顶索引
题目链接:
题目描述:
![Description Image Removed]
题目示例:
![Example Image Removed]
解法(二分查找):
这里暴力解法大家自己实现一下,我就不实现了
算法思路:
分析峰顶位置的数据特点,以及山峰两旁的数据的特点:
- 峰顶数据特点: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 = 1, right = arr.size() - 2;
while (left < right) {
int mid = left + (right - left + 1) / 2;
if (arr[mid] > arr[mid - 1]) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
};
22. 寻找峰值
题目链接:


