二分查找
- 思路:
- 查找数组峰值,即 index 数值比左右节点的值都大,是一个局部极大值,可能是最大值,不一定是最大值;
- 可以假定左右边界向 mid 靠拢,找到峰值;
- 如果 nums[mid] < nums[mid + 1],更新左边界 left = mid + 1,如果此时是峰值,那么右边界 right 会不断向 left 靠拢,峰值快速的夹逼到 left 边界;
- 在 left 已经是较大时,要么 right 一直小,最终在 left 上收敛到峰值;
- 要么在中间过程在 mid 右侧有峰值 mid + 1,然后将峰值 mid + 1 更新到 left,回归到 (1);
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int size = nums.size();
int left = 0;
int right = size - 1;
while (left < right) {
int mid = (right - left) / 2 + left;
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};