Leetcode--162. 寻找峰值
发布日期:2021-04-30 21:04:39 浏览次数:73 分类:精选文章

本文共 1095 字,大约阅读时间需要 3 分钟。

峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],任务是找到峰值元素并返回其索引。数组可能包含多个峰值,此时可以返回任何一个。

方法思路

为了高效地找到峰值元素,可以使用二分查找算法。二分查找的时间复杂度为 O(logN),满足题目要求的时间复杂度。以下是详细的步骤:

  • 设定区间:从数组的开头到末尾,设定初始区间 low=0,high=nums.length-1。
  • 终止条件:当 low 等于 high 时,返回该索引作为峰值。
  • 计算中间点:计算当前区间的中间点 mid。
  • 比较中间点和右边点:如果 nums[mid] > nums[mid+1],说明当前区间内可能存在峰值,继续查找右边的子区间(low=mid+1)。
  • 继续查找:如果 nums[mid] < nums[mid+1],说明峰值在左边的子区间(high=mid)。
  • 这种方法确保在每一步都将搜索范围缩小为之前的一半,从而在 O(logN) 时间内找到峰值。

    代码实现

    class Solution {    public int findPeakElement(int[] nums) {        return search(nums, 0, nums.length - 1);    }    public int search(int[] nums, int low, int high) {        if (low == high) {            return low;        }        int mid = (low + high) / 2;        if (nums[mid] > nums[mid + 1]) {            return search(nums, mid + 1, high);        } else {            return search(nums, low, mid);        }    }}

    代码解释

    • findPeakElement 方法调用递归函数 search,初始调用区间为整个数组。
    • search 方法递归地缩小搜索范围:
      • 当 low 等于 high 时,返回该索引。
      • 计算中间点 mid,比较 nums[mid] 和 nums[mid+1] 的大小:
        • 如果 nums[mid] 大于 nums[mid+1],继续搜索右边的子区间。
        • 否则,继续搜索左边的子区间。

    这种方法高效且简洁,能够在 O(logN) 时间内找到数组中的峰值元素。

    上一篇:realloc()函数
    下一篇:【剑指offer】面试题29:顺时针打印矩阵(Java)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年06月07日 10时24分15秒