二分查找法求是否存在局部最小值

在这里插入图片描述
如图所示。
当出现三种情况的时候存在局部最小值。
1、mid<left 并且mid<right 此时mid为局部最小。
2、mid<left 但是mid>right 此时mid——L 或者mid——R 中间存在局部最小
3、mid>left 但是mid<right 此时mid——L 或者mid——R 中间存在局部最小

我们可以先考虑一些特殊边界条件
1、为空时候直接返回 不存在
2、一个元素就是局部最小直接返回
3、第二个元素小于第一个元素 返回第二个元素
4、倒数第二个元素小于倒数第一个元素 返回倒数第二个元素

正常情况条件考虑
mid>mid-1的值此时为上图3所示 。所以L-mid存在局部最小 R可以来到mid-1位置
mid>mid+1的值此时为上图而所示。所以mid-R存在局部最小 L可以来到mid+1位置
否则情况为图一直接返回mid即可

  //局部最小
    public static void main(String[] args) {
        int [] arr = {1123,2,34,31,3,23,5,23};
        int index = bSAwesome(arr);
        System.out.println(index);
    }

    private static int bSAwesome(int[] arr) {
        //空集合返回
        if (null==arr || arr.length==0) {
            return -1;
        }
        //一个元素直接返回
        if (arr.length<2) {
            return 0;
        }
        //1下标大于0下标
        if (arr[0]>arr[1]) {
            return 1;
        }
        //最后两位比较
        if (arr[arr.length-1]>arr[arr.length-2]) {
            return arr.length-2;
        }
        int mid = 0;
        int L = 0;
        int R = arr.length-1;
        while (L<R){
            // mid >前面
            if(arr[mid]>arr[mid-1]){
                R = mid-1;
            }else if(arr[mid]>arr[mid]+1){
                L = mid+1;
            }else{
                return mid;
            }
        }
        return L;
    }
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值