BM19 寻找峰值(java版本)

题目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:
1、数组两边界是负无穷,看成最小
2、用二分法取中间位置m的数,往一定有峰的方向走,怎么确定哪个方向一定有峰呢?
1)如果m中点右边趋势往下,右半部分不一定有峰,舍弃右半部分。为什么左边一定有峰?左半部分从下标m开始往左看 一是先上再下有峰;二是一直向上,而左边界是负无穷,有峰;
2)如果m中点右边趋势往上,右半部分一定有峰,舍弃左半部分。为什么左边一定有峰?一是 m中点向上之后可能会向下,有峰;二是一直向上,而右边界是负无穷,有峰。

3、最终l=r,左右两点相遇就是峰值

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
        int l=0;
        int r=nums.length-1;
        //数组两边界是负无穷,看成最小
        
       
        while(l<r){//l=r不用进来了,说明相遇了,该点就是峰
            int m=l+ (r-l)/2;
            if(nums[m]>nums[m+1]){
                
                //右边趋势往下,不一定有峰,所以舍弃右半部分,缩小r,
                //且m本身可能是峰,所以是r=m,不是r=m-1;
                r=m;
            }else if(nums[m]<nums[m+1]){
                //右边趋势往上,一定有峰,且不可能是m,舍弃左半部分,所以l=m+1
                l=m+1;
            }
        }
        return r;
    }
}


版权声明:本文为weixin_45429720原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>