文章目录
1 题目
2 思路
使用二分查找来遍历向量,如果该点大于左、右点两个位置的,就返回该值;如果该点小于左相邻点的值,那么峰值一定在左半边的区域(因为-1和n都是-∞;同理,如果该点小于右相邻点的值,那么峰值在右半边的区域),区域缩小为左半区间,剩余的情况,让区间缩小到右半区间。
如果该点为第一个点或者最后一个点,为了方便比较,使用pair
作为比较对象,first值除了位置-1和n的值为0外,其余的都为1,second值为nums[i]实际值,这样就可以让位置-1和n都是恒小于所有值。pair
可以做比较,先比较first值,在比较second值。
- 考点:二分,
pair
3 代码
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
if(n == 1) return 0;
auto get = [&](int i) ->pair<int, int>{
if(i == -1 || i == n) return {0, 0};
else return {1, nums[i]};
};
int l = 0, r = n - 1;
int ans = -1;
while(l <= r){
int mid = (l + r) /2;
if(get(mid) > get(mid - 1) && get(mid) > get(mid + 1)){
ans = mid;
break;
}else if(get(mid - 1) > get(mid)){
r = mid - 1;
}else{
l = mid + 1;
}
}
return ans;
}
};
/**
if (get(mid) < get(mid + 1)) {
left = mid + 1;
}
else {
right = mid - 1;
}
**/