题解 | #寻找峰值#

寻找峰值

http://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

    public int findPeakElement (int[] nums) {
        //分析二分条件,Mid位置,有如下几种情况
        //1.nums[i-1]<nums[i]<nums[i+1] 上坡,向右走找到当前的坡顶
        //2.nums[i-1]>nums[i]>nums[i+1] 下坡,向左走找到坡顶
        //3.nums[i-1]<nums[i]>nums[i+1] 峰值,直接返回
        //4.nums[i-1]>nums[i]<nums[i+1] 在坑里,向左向右都有坡顶,那就规定向右吧
        //综上所述:加上不可能出现折返的情况,可以二分
        //如果1.峰值返回2.nums[i]<nums[i+1]则向右3.其他向左
        if(nums==null||nums.length==0) return -1;
        int N = nums.length;
        if(N==1) return 0;
        if(N==2) return nums[0]>nums[1]?0:nums[0]==nums[1]?-1:1;
        if(nums[0]>nums[1]) return 0;
        if(nums[N-1]>nums[N-2]) return N-1;
        int left = 0,right = N-1;
        while(left<right){
            int mid = ((right-left)>>>1)+left;
            if(nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1]){
                return mid;
            }else if(nums[mid]<nums[mid+1]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return left==right?left:-1;
    }
waigo的刷题之路 文章被收录于专栏

收录平时刷题的题解

全部评论

相关推荐

有没有友友知道这样是开启下一个志愿还是在池子里等人捞
早饭有梨:为什么有的是回到人才池,有的是变成筛选中,我二面挂直接变回筛选中了
点赞 评论 收藏
分享
不放弃的小鱼干很洒脱:好可爱的离职理由
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务