寻找峰值
描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
- 峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
- 假设
nums[-1]=nums[n]=−∞
- 对于所有有效的
i
都有nums[i] != nums[i+1]
数据范围:
1≤nums.length≤2*105
-231≤nums[i]≤231-1
如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1
1 | 输入: [2,4,1,2,7,8,4] |
示例2
1 | 输入: [1,2,3,1] |
题解
- 二分查找首先从数组首尾开始,每次取中间值,直到首尾相遇
- 如果中间值的元素大于它右边的元素,说明往右是向下,我们不一定会遇到波峰,但是那就往左收缩区间
- 如果中间值大于右边的元素,说明此时往右是向上,向上一定能有波峰,那我们往右收缩区间
- 最后区间收尾相遇的点一定就是波峰
![寻找峰值.gif](/images/寻找峰值.gif)
1 | package main |