寻找峰值
字数 874 2025-10-27 17:27:05
寻找峰值
题目描述:给定一个整数数组nums,其中相邻元素不相等。请你找到任意一个峰值元素并返回其索引。峰值元素是指其值严格大于左右相邻值的元素。数组可能包含多个峰值,返回任意一个峰值的位置即可。对于数组边界元素,可以认为nums[-1] = nums[n] = -∞。
解题过程:
-
理解问题:峰值元素需要大于其左右邻居。由于数组边界外的元素被视为负无穷,因此第一个元素只需大于第二个元素,最后一个元素只需大于倒数第二个元素,就能成为峰值。
-
关键观察:由于相邻元素不相等,数组中的数值变化是连续的"上升"或"下降"趋势。只要存在上升趋势,沿着上升方向就一定能找到峰值。
-
二分查找应用:
- 初始化left=0, right=n-1
- 当left < right时循环:
a. 计算中点mid = left + (right-left)/2
b. 比较nums[mid]和nums[mid+1]:- 如果nums[mid] > nums[mid+1],说明mid处于下降趋势,峰值在左侧(可能是mid本身),令right=mid
- 如果nums[mid] < nums[mid+1],说明mid处于上升趋势,峰值在右侧,令left=mid+1
- 循环结束时left==right,该位置就是峰值
-
正确性证明:每次迭代都保证峰值存在于[left,right]区间内。当nums[mid] > nums[mid+1]时,mid可能是峰值,且左侧必有峰值;当nums[mid] < nums[mid+1]时,右侧必有峰值。
-
示例演示:
数组[1,2,3,1]- 初始:left=0, right=3, mid=1 → nums[1]=2 < nums[2]=3 → left=2
- 第二轮:left=2, right=3, mid=2 → nums[2]=3 > nums[3]=1 → right=2
- 结束:返回索引2(值为3的峰值)
-
复杂度分析:时间复杂度O(log n),空间复杂度O(1),满足高效查找要求。