力扣:寻找峰值
发布日期:2021-05-08 20:01:11 浏览次数:22 分类:精选文章

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

题目描述了一个山脉数组的定义,并要求我们找到该数组中的峰值下标。通过分析,我们可以采用二分查找的方法来高效解决这个问题。

首先,我们需要明确山脉数组的特征:数组长度至少为3,存在一个峰值点i,使得从左到i的元素递增,从i到右的元素递减。我们的目标是找到这个i值。

方法思路

我们可以模仿查找最小值的思路,通过二分查找来确定峰值的位置。具体来说,我们从数组的两端开始,逐步缩小搜索范围:

  • 上坡状态:如果当前元素右侧大于当前元素,说明峰值在右侧,继续搜索右侧。
  • 下坡状态:如果当前元素左侧大于当前元素,说明峰值在左侧,继续搜索左侧。
  • 峰值点:如果两种情况都不满足,当前位置就是峰值点。
  • 这种方法的时间复杂度是O(log n),非常高效。

    解决代码

    public int peakIndexInMountainArray(int[] arr) {
    if (arr.length == 3) return 1;
    int left = 0, right = arr.length - 1;
    while (left <= right) {
    int mid = left + (right - left) / 2;
    if (arr[mid + 1] > arr[mid]) {
    left = mid + 1;
    } else if (arr[mid - 1] > arr[mid]) {
    right = mid - 1;
    } else {
    return mid;
    }
    }
    return -1;
    }

    代码解释

  • 初始条件:如果数组长度为3,直接返回中间的下标1,因为中间元素一定是峰值。
  • 二分查找:设置left和right指针,分别指向数组的开头和结尾。
  • 计算中点:计算当前中点mid的位置。
  • 上坡判断:如果右侧元素大于当前元素,说明当前位置在上坡,调整left指针到mid+1继续搜索右侧。
  • 下坡判断:如果左侧元素大于当前元素,说明当前位置在下坡,调整right指针到mid-1继续搜索左侧。
  • 返回峰值:如果上坡和下坡情况都不满足,当前mid就是峰值点,返回mid。
  • 这种方法通过逐步缩小搜索范围,高效地找到峰值点,确保了算法的高效性。

    上一篇:力扣:山脉数组中查找目标值
    下一篇:力扣:搜索旋转排序数组 II

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月18日 03时11分24秒