leetcode162.寻找峰值
题目给出两个关键条件,为二分查找提供了基础:
- 边界条件:
nums[-1] = nums[n] = -∞
(数组两端视为负无穷),确保数组中一定存在峰值(如递增数组的最后一个元素、递减数组的第一个元素)。 - 相邻元素不相等:
nums[i] != nums[i+1]
,避免了 “相等元素无法判断趋势” 的情况。
二分查找的核心逻辑:
- 取中间元素
mid
,比较nums[mid]
与nums[mid+1]
:- 若
nums[mid] < nums[mid+1]
:右侧存在递增趋势,峰值一定在右侧(要么继续递增到末尾,要么中途下降形成峰值),因此收缩左边界left = mid + 1
。 - 若
nums[mid] > nums[mid+1]
:左侧存在递减趋势,峰值一定在左侧(要么继续递减到开头,要么中途上升形成峰值),因此收缩右边界right = mid
。
- 若
- 重复上述过程,直到
left == right
,此时left
(或right
)即为峰值索引。
class Solution {public int findPeakElement(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < nums[mid + 1]) {left = mid + 1;} else {right = mid;} }return left;}
}