二分与排序中等2 种解法

#162寻找峰值

返回任意一个严格大于左右相邻元素的峰值下标,数组边界外视为负无穷。

#数组#二分查找

解题主线

01

比较 nums[mid] 与 nums[mid + 1]:上坡时右侧必有峰值,下坡时 mid 及其左侧必有峰值。

解法 1二分沿坡上行

保留必含峰值的一半区间,直到左右边界收敛。

时间复杂度

O(log n)

空间复杂度

O(1)

162. 寻找峰值 · 二分沿坡上行
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)

162. 寻找峰值 · 寻找全局最大值
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