导航菜单

寻找峰值

🟡 中等

题目描述

峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。如果数组存在多个峰值,则返回任何一个峰值所在位置即可。

示例 1

输入:nums = [1, 2, 3, 1]
输出:2
解释:3 是峰值元素,返回索引 2

示例 2

输入:nums = [1, 2, 1, 3, 5, 6, 4]
输出:1 或 5
解释:返回索引 1(峰值 2)或索引 5(峰值 6)都可以

提示

  • 1 <= nums.length <= 1000
  • -2^31 <= nums[i] <= 2^31 - 1
  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

解法

参考答案 (2 个标签)
二分查找 O(log n)

思路

如果 nums[mid] < nums[mid + 1],说明右侧一定有峰值(爬坡方向);否则左侧一定有峰值。

代码实现

/**
 * @param {number[]} nums
 * @return {number}
 */
function findPeakElement(nums) {
    let left = 0;
    let right = nums.length - 1;
    
    while (left < right) {
        const mid = Math.floor((left + right) / 2);
        
        if (nums[mid] < nums[mid + 1]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    
    return left;
}

复杂度分析

  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

为什么一定有峰值?

  1. 数组边界可以视为负无穷
  2. 如果一直上升,最后一个元素是峰值
  3. 如果一直下降,第一个元素是峰值
  4. 如果有升有降,转折点就是峰值

搜索