[优选算法专题三.二分查找——NO.22寻找峰值]
题目链接
162. 寻找峰值
题目描述
题目解答
- 功能:根据题目定义,峰值元素是指其值严格大于左右相邻值的元素。代码实现了一个时间复杂度为 O (log n) 的算法来查找数组中的峰值元素,若存在多个峰值,返回任意一个峰值的索引即可。
- 代码逻辑:
- 初始化左右指针:
int left = 0, right = nums.size() - 1;
,将左指针left
指向数组起始位置,右指针right
指向数组末尾位置。 - 二分查找循环:
while (left < right)
,当left
小于right
时,循环继续,这保证了查找区间内至少有两个元素。 - 计算中间位置:
int mid = left + (right - left) / 2;
,通过这种方式计算中间位置mid
,可以避免(left + right)
可能产生的整数溢出问题。 - 调整查找区间:如果
nums[mid] > nums[mid + 1]
,说明当前位置形成了一个 “下降趋势”,即mid
左侧可能存在峰值,因此将右边界right
移动到mid
;否则,说明当前位置形成了一个 “上升趋势”,即mid
右侧必定存在峰值,将左边界left
移动到mid + 1
。 - 返回结果:循环结束后,
left
和right
会相遇,此时left
指向的位置就是峰值元素的索引,故返回left
。
- 初始化左右指针:
例如,对于数组[1, 2, 1, 3, 5, 6, 4]
,第一次二分mid
指向2
,nums[mid]>nums[mid + 1]
不成立,left
更新为mid+1
即3
;第二次二分mid
指向5
,nums[mid]>nums[mid + 1]
成立,right
更新为mid
即5
;继续循环,最终left
和right
会都指向5
,返回5
,此时索引5
对应的元素6
就是峰值元素。