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;}
}