leetcode题解162-寻找峰值
发布日期:2025-04-05 05:11:55 浏览次数:12 分类:精选文章

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

在解决这个问题时,我们需要找到数组中的一个峰值元素,并返回其索引。峰值元素定义为其值大于左右相邻元素的值。假设数组的两端是负无穷大,这意味着至少存在一个峰值元素。

方法思路

为了高效地找到峰值元素,我们可以使用二分查找算法。二分查找的时间复杂度为O(logN),能够在对数时间内解决问题,非常适合处理较长的数组。

以下是详细的步骤解释:

  • 初始化指针:左指针left设为0,右指针right设为数组长度减1。
  • 循环条件:持续进行查找,直到找到峰值或者退出循环。
  • 计算中间值:每次计算中间值mid,比较nums[mid]nums[mid+1]的大小。
  • 调整指针:如果nums[mid]大于nums[mid+1],说明有一个峰值在左边侧,调整右指针rightmid。如果nums[mid]小于或等于nums[mid+1],说明有一个峰值在右边侧,调整左指针leftmid+1
  • 返回结果:当找到的索引满足峰值元素的条件时,返回此索引。
  • 解决代码

    class Solution {    public int findPeakElement(int[] nums) {        int n = nums.length;        int left = 0;        int right = n - 1;        while (left <= right) {            int mid = left + (right - left) / 2;            if (nums[mid] < nums[mid + 1]) {                left = mid + 1;            } else {                right = mid - 1;            }        }        return left;    }}

    代码解释

    • 初始化:左指针left从数组起始位置开始,右指针right从数组末尾位置开始。
    • 循环查找:按二分查找的方法进行查找,计算中间值mid
    • 比较判断:如果当前中间值小于右边值,说明峰值在右边,调整左指针。反之,调整右指针。
    • 终止条件:当left超过right时,循环结束,此时left指针的值即为找到的峰值索引。

    这种方法利用了二分查找在数组中找峰值的特性,能够在对数时间内高效解决问题,适用于长度较大的数组。

    上一篇:leetcode题解167-两数之和 II - 输入有序数组
    下一篇:leetcode题解153-寻找旋转排序数组的最小值

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月18日 06时43分21秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章