funcfindPeakElement(nums []int)int{left, right :=0,len(nums)-1for left < right {mid :=(left + right)/2if nums[mid]< nums[mid+1]{left = mid +1}else{right = mid}}return left
}
二、算法分析
1. 核心思路
二分查找策略:利用山峰特性,每次比较中间元素与其右侧元素
方向选择:
若右侧存在更大值,则峰值必在右侧
否则峰值在左侧或当前中间位置
终止条件:当左右指针重合时即为峰值位置
2. 关键步骤
初始化指针:left=0, right=n-1
循环处理:
计算中间位置mid
比较nums[mid]与nums[mid+1]
根据比较结果收缩左右边界
返回结果:最终left即为峰值索引
3. 复杂度
指标
值
说明
时间复杂度
O(log n)
二分查找每次折半范围
空间复杂度
O(1)
仅用固定变量
三、图解示例
四、边界条件与扩展
1. 特殊场景验证
单元素数组:直接返回0
严格递增数组:返回最后一个元素索引
严格递减数组:返回第一个元素索引
多个峰值存在:返回任意正确结果
2. 扩展应用
二维峰值查找:在矩阵中寻找满足条件的峰值
动态数据流:实时维护并快速查询当前数据流的峰值位置
周期性数组:处理环形数组的峰值查找
3. 多语言实现
classSolution{publicintfindPeakElement(int[] nums){int left =0, right = nums.length -1;while(left < right){int mid = left +(right - left)/2;if(nums[mid]< nums[mid +1]){left = mid +1;}else{right = mid;}}return left;}}
classSolution:deffindPeakElement(self, nums: List[int])->int:left, right =0,len(nums)-1while left < right:mid =(left + right)//2if nums[mid]< nums[mid +1]:left = mid +1else:right = midreturn left