Leetcode -- 162. 寻找峰值

Problem: 162. 寻找峰值

思路

根据题目条件,一个数的左边比它大,那么它的左边一定存在一个峰值,右边同理

解题方法

利用二分法查找峰值,注意特殊边界的特判。

复杂度

时间复杂度:

添加时间复杂度, 示例: $Olog(n)$

空间复杂度:

添加空间复杂度, 示例: $Olog(n)$

Code

class Solution {
    public int findPeakElement(int[] nums) {
        int len = nums.length;
        if (len == 1 || nums[0] > nums[1]) {
            return 0;
        }
        if (nums[len - 1] > nums[len - 2]) {
            return len - 1;
        }

        int left = 0;
        int right = len - 1;
        int mid;
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            if (mid == 0) {
                return nums[0] > nums[1] ? 0 : 1;
            } else if (mid == len - 1) {
                return nums[mid] > nums[mid - 1] ? mid : mid-1;
            }

            if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
                return mid;
            }

            if (nums[mid - 1] > nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return -1;
    }
}
posted @ 2023-12-18 21:50  扫地の小沙弥  阅读(4)  评论(0编辑  收藏  举报