LC 162二分查找中等第 19 / 95 题

寻找峰值

Find Peak Element

二分边界虚拟值
本机进度仅保存在当前浏览器

题目描述

峰值元素是严格大于左右相邻值的元素。给定数组 nums(相邻元素不等),nums[-1] 与 nums[n] 视为负无穷,返回任意一个峰值的下标。要求 O(log n)。

示例:nums = [1, 2, 3, 1],输出 2。

解题思路

  1. 峰值一定存在:整体最大值必然是峰值。比较中点与右邻 nums[mid] 与 nums[mid + 1]。
  2. 若 nums[mid] < nums[mid + 1],说明处于"上坡",右半区间内必有峰值(上坡尽头或到边界前必转折)。
  3. 反之处于"下坡或峰顶",左半区间(含 mid)必有峰值。
  4. 每次安全淘汰一半,看似无序的数组因此可以二分——核心是"爬坡方向必有峰"这一存在性论证。

参考实现

查看参考实现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

复杂度与归属

时间复杂度O(log n)
空间复杂度O(1)
所属分类二分查找
题源LeetCode 162

关联教程

返回题图鉴