LeetCode算法题(Go语言实现)_55
题目
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
一、代码实现(二分查找)
func findPeakElement(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. 多语言实现
class Solution {public int findPeakElement(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;}
}
class Solution:def findPeakElement(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
五、总结与优化
1. 算法对比
| 方法 | 优势 | 适用场景 |
|---|---|---|
| 二分法 | O(log n)时间复杂度 | 单峰/多峰查找 |
| 线性扫描 | 简单直观 | 数据量较小 |
| 分治法 | 并行计算潜力 | 特殊结构数据 |
2. 工程优化
- 溢出处理:使用
left + (right-left)/2计算中间值 - 预处理检查:快速处理边界情况(如数组头尾)
- 内存对齐:优化数组访问模式提升缓存命中率
3. 扩展方向
- K维峰值查找:扩展到高维空间的峰值搜索
- 模糊匹配:处理存在相等元素的近似峰值查找
- 硬件加速:利用GPU并行计算加速大规模数据查找
