二分查找(四种常用模板)

二分查找

1.复杂度

时间复杂度:O(logn)

2.代码实现

2.1代码实现

class binarysort{
    /**
     * 找到相等的点
     * @param aa
     * @param target
     * @return
     */
    static int eq(int aa[],int target){
        int l=0,r=aa.length-1;
        while(l<=r){
            int c=l+(r-l)/2;
            if(aa[c]==target)return c;
            else if(aa[c]>target)r=c-1;//r右边全都大于target
            else l=c+1;//l左边全都小于target
        }
        return -1;
    }

    /**
     * 找到第一个大于target的点
     * @param aa
     * @param target
     * @return
     */
    static int b(int aa[],int target){
        int l=0,r=aa.length-1;
        while(l<=r){
            int c=l+(r-l)/2;
            if(aa[c]>target)r=c-1;//r右边全都大于target
            else l=c+1;//l左边全都小于等于target
            //最终出循环一定是r=l-1
        }
        return l==aa.length?-1:l;
    }
    /**
     * 找到第一个大于等于target的点
     * @param aa
     * @param target
     * @return
     */
    static int be(int aa[],int target){
        int l=0,r=aa.length-1;
        while(l<=r){
            int c=l+(r-l)/2;
            if(aa[c]>=target)r=c-1;//r右边全都大于等于target
            else l=c+1;//l左边全都小于target
            //最终出循环一定是r=l-1
        }
        return l==aa.length?-1:l;
    }

    /**
     * 找到第一个小于target的下标
     * @param aa
     * @param target
     * @return
     */
    static int l(int aa[],int target){
        int l=0,r=aa.length-1;
        while(l<=r){
            int c=l+(r-l)/2;
            if(aa[c]>=target)r=c-1;//r右边全都大于等于target
            else l=c+1;//l左边全都小于target
            //最终出循环一定是r=l-1
        }
        return r;
    }

    /**
     * 找到第一个小于等于target的下标
     * @param aa
     * @param target
     * @return
     */
    static int le(int aa[],int target){
        int l=0,r=aa.length-1;
        while(l<=r){
            int c=l+(r-l)/2;
            if(aa[c]>target)r=c-1;//r右边全都大于target
            else l=c+1;//l左边全都小于等于target
            //最终出循环一定是r=l-1
        }
        return r;
    }

    public static void main(String[]args){
        int aa[]={1,2,3,4,5,5,5,6,7,8,9};
        System.out.println(be(aa,5));
        System.out.println(b(aa,4));
        System.out.println(le(aa,5));
        System.out.println(l(aa,6));
    }
}
posted @ 2022-11-23 12:14  青尤尘  阅读(57)  评论(0)    收藏  举报