LeetCode 162. 寻找峰值

题目描述

162. 寻找峰值

image-20230308130618498

思路分析

解法一:二分查找(推荐)

核心思路

题目保证边界值为负无穷,因此峰值一定存在。利用「爬坡」策略:

  • nums[mid] < nums[mid+1]:右侧仍在上坡,峰值在 mid+1 及其右侧
  • nums[mid] > nums[mid+1]:当前在下坡,峰值在 mid 及其左侧(含 mid)

收敛:使用闭区间 [left, right],循环条件 left < right,当 left == right 时即为峰值所在位置。

正确性:每次缩短区间后,剩余区间内仍包含至少一个峰值(边界性质保证)。


复杂度分析

  • 时间复杂度:O(log n),其中 n 为数组长度,每次折半
  • 空间复杂度:O(1),仅使用常数额外空间
class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            // 右侧在上坡,峰值在右半段
            if (nums[mid] < nums[mid + 1]) {
                left = mid + 1;
            } else {
                // 当前在下坡,峰值在左半段(含 mid)
                right = mid;
            }
        }
        // left == right 时即为峰值位置
        return left;
    }
}
func findPeakElement(nums []int) int {
	left, right := 0, len(nums)-1
	for left < right {
		mid := (left + right) / 2
		// 右侧在上坡,峰值在右半段
		if nums[mid] < nums[mid+1] {
			left = mid + 1
		} else {
			// 当前在下坡,峰值在左半段(含 mid)
			right = mid
		}
	}
	return left
}

相似题目

题目 难度 考察点
704. 二分查找 简单 二分查找基础
33. 搜索旋转排序数组 中等 非严格有序二分
153. 寻找旋转排序数组中的最小值 中等 旋转数组二分
852. 山脉数组的峰顶索引 中等 二分找峰顶
1095. 山脉数组中查找目标值 困难 二分找峰+两侧查找
1901. 寻找峰值 II 中等 二维矩阵二分找峰
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/09730219
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!