力扣面试150 寻找峰值 二分
Problem: 162. 寻找峰值
👨🏫 参考图解
class Solution {
public int findPeakElement(int[] nums) {
int l = 0; // 初始化左边界,表示数组的起始位置
int r = nums.length - 1; // 初始化右边界,表示数组的结束位置
// 当左边界和右边界没有重合时,持续二分查找
while(l < r){
// 计算中间位置,避免整数溢出(相当于 (l + r) / 2)
int m = l + (r - l) / 2;
// 判断当前位置的元素与右边相邻元素的关系
if(nums[m] > nums[m + 1]){
// 如果当前元素大于右边相邻的元素,说明中点处于一个“下坡”阶段,
// 峰值可能在左侧(包括当前元素,因为它可能是一个峰值)
r = m; // 收缩右边界到中点位置,继续在左半部分查找
} else {
// 如果当前元素小于或等于右边相邻元素,说明中点处于“上坡”阶段,
// 峰值一定在右侧区域
l = m + 1; // 左边界移动到中点的右侧,继续在右半部分查找
}
}
// 最终,左右边界会收缩至同一点,此时该点一定是一个峰值
return l;
}
}