二分与排序中等2 种解法
#162寻找峰值
返回任意一个严格大于左右相邻元素的峰值下标,数组边界外视为负无穷。
#数组#二分查找
解题主线
01
比较 nums[mid] 与 nums[mid + 1]:上坡时右侧必有峰值,下坡时 mid 及其左侧必有峰值。
解法 1:二分沿坡上行
保留必含峰值的一半区间,直到左右边界收敛。
时间复杂度
O(log n)
空间复杂度
O(1)
java
final class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int middle = left + (right - left) / 2;
if (nums[middle] > nums[middle + 1]) right = middle;
else left = middle + 1;
}
return left;
}
}保留必含峰值的一半区间,直到左右边界收敛。
解法 2:寻找全局最大值
全局最大值在相邻不等的数组中一定是合法峰值。
时间复杂度
O(n)
空间复杂度
O(1)
java
final class Solution {
public int findPeakElement(int[] nums) {
int maximum = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[maximum]) maximum = i;
}
return maximum;
}
}全局最大值在相邻不等的数组中一定是合法峰值。
边界与易错点
- 二分循环使用 left < right,才能安全访问 mid + 1。
- 题目保证相邻元素不相等;这是严格峰值存在性的关键。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
easy/Q162_findPeakElement.java