BinarySearch

BinarySearch
package Week4;

public class BinarySearch {
    //有重复值时二分查找的API返回的是第一个数的下标
    public static void main(String[] args) {
                            //0,1,2,3,4,5,6,7,8,9,10,11,12
        int arr[] = new int[]{1,1,2,3,4,4,4,5,6,7,8, 8,9};//12
        int start = downBinarySearch(arr,0,12,8);//找第一个4的位置
        System.out.println(start);
        int end = upBinarySearch(arr,0,12,8);//找第二个8的位置
        System.out.println(end);
        
    }

    //找下限,找有重复值的第一个数的下标,即找第一个4的下标
    private static int downBinarySearch(int[] arr, int l, int r,int target) {
        while(l<r) {
            int m = (l+r)/2;
            if(arr[m]>=target) {
                r=m;
            }else {
                l=m+1;
            }
        }
        return l;
    }

    //1.找下限,找有重复值的最后一个数的下一个数的下标比如1,1,2,3,4,4,4,5,6,7,8, 8,9找第二个8返回12
    //如果最后重复数字的下一位没有数字,比如8就是最后一位,返回的就是当前8的下标
    //2.找下限,找有重复值的最后一个数的下一个数的下标比如1,1,2,3,4,4,4,5,6,7,8, 8找第二个8返回当前8的下标11=======需要特殊处理一下
    //如果最后重复数字的下一位有数,比如8的下一位有数返回的就是8的下一位数的下标
    private static int upBinarySearch(int[] arr, int l, int r,int target) {
        while(l<r) {
            int m = (l+r)/2;
            if(arr[m]<=target) {
                l = m+1;
            }else {
                r = m;
            }
        }
        return l;
    }
}
View Code

 

上一篇:LeetCode第七十四题—搜索二维矩阵—Python实现


下一篇:二分查找 while & 递归