二分查找(BinarySearch)

本文介绍了二分查找算法在有序数组中的三种常见应用:查找是否存在目标值、找到大于等于目标值的最左下标以及小于等于目标值的最右下标。每个应用场景都提供了详细的代码实现,包括如何更新查找范围以及何时终止查找。这些方法的时间复杂度均为O(logN),具有较高的效率。
摘要由CSDN通过智能技术生成

二分时间复杂度(logN)

二分查找是否存在

二分查找要求线性表必须采用顺序存储结构。
1.假设按升序排列,将表中间位置记录的关键字(下标为middle)与查找关键字(value)比较,
如果midvalue=value,则查找成功;
否则利用midvalue将表分成前、后两个子表,如果midvalue>value,则进一步查找前一子表,
否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

public class Code01_BinarySearch {

    //二分查找对应的num数,要求arr有序
    public static boolean  find(int arr[] ,int num){
        if(arr == null || arr.length == 0){
            return false;
        }
        int L = 0 ;
        int R = arr.length -1;
        while (L <= R ){
            int middle = ( L + R) / 2;
            if(arr[middle] == num ){
                return true;
            }else if(arr[middle] < num){
                L = middle + 1;
            }else if(arr[middle] > num){
                R = middle - 1;
            }
        }
        return false;
    }
}

二分查找,>=value,最左的下标位置

public class Code01_BinarySearchMostLeft {

    //使用二分查找,arr中(有序),满足 >=value最左的位置
    public static int mostLeftIndex(int[]arr ,int num){
        if(arr == null || arr.length == 0){
            return -1;
        }
        int L= 0;
        int R = arr.length -1 ;
        //定义一个需要返回的index,默认-1
        int ans = -1;
        while (L<=R){
            int middle = (L+R) / 2 ;
            if(arr[middle] >= num){
                ans = middle;
                R = middle - 1;
            }else if(arr[middle] < num){
                L = middle + 1;
            }
        }
        return ans;
    }
}

**

二分查找,<=value,最右的下标位置

**

public class Code01_BinarySearchMostRight {

    //使用二分查找,arr中(有序),满足 >=value最右的位置
    public static int mostRightIndex(int[]arr ,int num){
        if(arr == null || arr.length == 0){
            return -1;
        }
        int L= 0;
        int R = arr.length -1 ;
        //定义一个需要返回的index,默认-1
        int ans = -1;
        while (L<=R){
            int middle = (L+R) / 2 ;
            if(arr[middle] > num){
                R = middle - 1;
            }else if(arr[middle] <= num){
                ans = middle;
                L = middle + 1;
            }
        }
        return ans;
    }
}

二分查找,局部最小,arr无序,相邻不相等()

public class Code01_BinarySearchMinWesome {

    //二分查找 局部最小值,arr无序,相邻不相等,返回下标
    public static int  find(int arr[] ){
        if(arr == null || arr.length == 0){
            return -1;
        }
        int N = arr.length ;
        if(N == 1){
            return 0;
        }
        if(N == 2){
            return arr[0] > arr[1] ? 1: 0;
        }
        int L = 0 ;
        int R = N -1;
        //返回变量 默认-1

        while(L< R -1){
            int middle = (L+R)/2;
            //如果中间位置的数,既是小于左边,又小于右边,返回
            if(arr[middle]<arr[middle-1] && arr[middle]<arr[middle+1]){
                return middle;
            }else{
                if(arr[middle] > arr[middle-1]){
                    R = middle - 1;
                }else{
                    L = middle + 1 ;
                }
            }
        }
        return arr[L] > arr[R] ? R :L;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值