https://leetcode-cn.com/problems/B1IidL/
正向遍历
刚开始数组递增,当数组递减时,当前坐标即为山峰顶部
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
for (int i = 0; i < arr.size(); i++) {
if (arr[i] > arr[i+1]) {
return i;
}
}
return 0;
}
};
二分
很容易想到时间复杂度 O(n) 的解决方案,你可以设计一个 O(log(n)) 的解决方案吗?
log(n) 二分
[l, r]
表示山峰所处的区间
令mid = (l+r)/2
-
如果mid处于峰的左边, 就将
l
移动到mid+1
处 -
如果mid处于峰的右边, 就将
r
移动到mid
处
每次查找减少一般的区间
int l = 0;
int r = arr.size();
while (l < r) {
int mid = (l + r)/2;
if (arr[mid] < arr[mid+1]) {
l = mid+1;
}else {
r = mid;
}
}
return r;