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