LeetCode 162. 寻找峰值
题目描述
思路分析
解法一:二分查找(推荐)
核心思路:
题目保证边界值为负无穷,因此峰值一定存在。利用「爬坡」策略:
- 若
nums[mid] < nums[mid+1]:右侧仍在上坡,峰值在mid+1及其右侧- 若
nums[mid] > nums[mid+1]:当前在下坡,峰值在mid及其左侧(含 mid)收敛:使用闭区间
[left, right],循环条件left < right,当left == right时即为峰值所在位置。正确性:每次缩短区间后,剩余区间内仍包含至少一个峰值(边界性质保证)。
复杂度分析:
- 时间复杂度:O(log n),其中 n 为数组长度,每次折半
- 空间复杂度:O(1),仅使用常数额外空间
class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = (left + right) / 2;
// 右侧在上坡,峰值在右半段
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
// 当前在下坡,峰值在左半段(含 mid)
right = mid;
}
}
// left == right 时即为峰值位置
return left;
}
}
func findPeakElement(nums []int) int {
left, right := 0, len(nums)-1
for left < right {
mid := (left + right) / 2
// 右侧在上坡,峰值在右半段
if nums[mid] < nums[mid+1] {
left = mid + 1
} else {
// 当前在下坡,峰值在左半段(含 mid)
right = mid
}
}
return left
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 704. 二分查找 | 简单 | 二分查找基础 |
| 33. 搜索旋转排序数组 | 中等 | 非严格有序二分 |
| 153. 寻找旋转排序数组中的最小值 | 中等 | 旋转数组二分 |
| 852. 山脉数组的峰顶索引 | 中等 | 二分找峰顶 |
| 1095. 山脉数组中查找目标值 | 困难 | 二分找峰+两侧查找 |
| 1901. 寻找峰值 II | 中等 | 二维矩阵二分找峰 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
