寻找峰值
Find Peak Element
本机进度仅保存在当前浏览器
题目描述
峰值元素是严格大于左右相邻值的元素。给定数组 nums(相邻元素不等),nums[-1] 与 nums[n] 视为负无穷,返回任意一个峰值的下标。要求 O(log n)。
示例:nums = [1, 2, 3, 1],输出 2。
解题思路
- 峰值一定存在:整体最大值必然是峰值。比较中点与右邻 nums[mid] 与 nums[mid + 1]。
- 若 nums[mid] < nums[mid + 1],说明处于"上坡",右半区间内必有峰值(上坡尽头或到边界前必转折)。
- 反之处于"下坡或峰顶",左半区间(含 mid)必有峰值。
- 每次安全淘汰一半,看似无序的数组因此可以二分——核心是"爬坡方向必有峰"这一存在性论证。
参考实现
查看参考实现Python · 建议先自行作答
def findPeakElement(nums):
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] < nums[mid + 1]:
l = mid + 1 # 上坡,峰在右侧
else:
r = mid # 下坡/峰顶,峰在左侧含 mid
return l