LeetCode162. Find Peak Element【Java】

题目描述

find-peak-element

AC代码

/*
1.如果题目要求中没有说明nums[i]≠ nums[i+1],那么这个题目是没有办法用二分法去做的.
    为什么可以用二分法解题?
        通过二分法让nums[mid]和nums[mid+1]作比较,如果mid位置上的数比右边的小,那么
        mid的右侧一定会出现一个峰值(无论是单调递增还是出现波峰波谷的情况),通过二分法
        还可以少扫描一部分,降低复杂度。
2.边界问题:
    代码中出现了mid+1,可能会觉得当nums[mid]=nums[len-1]的时候,nums[mid+1]超出了数组边界
    其实不然,l=r,会退出循环,不会发生边界问题。举个例子:
       输入: nums = [1,2,3,1] 
       输出: 2
       解释: 
            第一次 l=0 r=3 mid=1 l=2 r=3 
            第二次 l=2 r=3 mid=2 l=2 r=2
            第三次 l=2 r=2 退出while循环,不会发生边界问题
3.这个题也可以通过循环来做,此时复杂度为O(n),通过二分法可以使复杂度降到O(logn)
*/

class Solution {
    public int findPeakElement(int[] nums) {
        int l=0,r=nums.length-1;
        while(l<r){
            int mid=l+r>>1;
            if(nums[mid]<nums[mid+1])
                l=mid+1;
            else
                r=mid;
        }
        return l;
    }
}
发布了201 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40992982/article/details/105460036
今日推荐