返回轨道
算法 · 2026-05-14 · 19 阅读

P175 查找数组的波峰

算法 19 阅读

信号摘要

难度:Medium · 时长:07:07 · leetcode 162 · lintcode 75

P175 查找数组的波峰

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个整数数组,数组中相邻的元素不相等,你要找到这个数组的波峰元素,然后返回它的下标。波峰元素指的是比左右相邻元素都要大的元素。

如果数组中包含多个波峰元素,则返回任意一个波峰元素的下标即可。你可以把数组左右边界之外的元素都看成负无穷大。

比如说,给你的数组是:

1, 2, 4, 1

这个数组中只有一个波峰元素 4,它大于左边的 2 和右边的 1。因此返回元素 4 的下标 2 即可。

再比如说,给你的数组是:

1, 2, 1, 2, 4

这个数组中有两个波峰元素,一个是 2,另一个为 4。波峰元素 2 大于它左右两边的 1,而波峰元素 4 大于左边的 2 和右边假想的负无穷大。因此返回这两个波峰元素任意的一个下标即可,也就是返回下标 1 或下标 4 都可以。

代码

public class AlgoCasts {

  // Time: O(n), Space: O(1)
  public int findPeakElementSequentialSearch(int[] nums) {
    if (nums == null || nums.length == 0) return -1;
    for (int i = 0; i < nums.length-1; ++i)
      if (nums[i] > nums[i+1])
        return i;
    return nums.length-1;
  }

  // Time: O(log(n)), Space: O(1)
  public int findPeakElementBinarySearch(int[] nums) {
    if (nums == null || nums.length == 0) return -1;
    int low = 0, high = nums.length-1;
    while (low < high) {
      int mid = low + (high - low) / 2;
      int left = mid-1 >= 0 ? nums[mid-1] : Integer.MIN_VALUE;
      int right = mid+1 < nums.length ? nums[mid+1] : Integer.MIN_VALUE;
      if (nums[mid] > left && nums[mid] > right) return mid;
      else if (left > nums[mid]) high = mid - 1;
      else low = mid + 1;
    }
    return low;
  }

}

📡 通讯频道