题目链接
题目描述

题目解答

- 功能:根据题目定义,峰值元素是指其值严格大于左右相邻值的元素。代码实现了一个时间复杂度为 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就是峰值元素。

1815

被折叠的 条评论
为什么被折叠?



