二分法的各种使用

二分法的几种使用

参数列表

目标值目标数组
int tarint[ ] arr

一、arr中含有tar值

//样例
    public static void main(String[] args) {
        int[] arr = new int[]{1,3,4,5,6,7,9};
        for(int i=0;i<=10;i++){
            int tar = i;
            System.out.println("tar为:"+tar+" --> "+ new Test().f1(tar,arr));
        }
    }
    public int f1(int tar, int[] arr) {
        int l=0,r=arr.length;
        while(l<r){
            int mid = l+(r-l)/2;
            if(arr[mid]>curv){
                r=mid;
            }else if(arr[mid]<curv){
                l=mid+1;
            }else {
                return mid;
            }
        }
        return -1;
    }
//结果
tar为:0 --> -1
tar为:1 --> 0
tar为:2 --> -1
tar为:3 --> 1
tar为:4 --> 2
tar为:5 --> 3
tar为:6 --> 4
tar为:7 --> 5
tar为:8 --> -1
tar为:9 --> 6
tar为:10 --> -1

二、arr中可以不含有tar值

1、求arr中大于等于tar的数的最小位置

//样例
    public static void main(String[] args) {
        int[] arr = new int[]{1,3,4,5,6,7,9};
        for(int i=0;i<=10;i++){
            int tar = i;
            System.out.println("tar为:"+tar+" --> "+ new Test().f2(tar,arr));
        }
    }
    public int f2(int tar, int[] arr) {
        int l=0,r=arr.length;
        while(l<r){
            int mid = l+(r-l)/2;
            if(arr[mid]>tar){
                r=mid;
            }else if(arr[mid]<tar){
                l=mid+1;
            }else {
                r=mid;
            }
        }
        return l;
    }
//结果
tar为:0 --> 0
tar为:1 --> 0
tar为:2 --> 1
tar为:3 --> 1
tar为:4 --> 2
tar为:5 --> 3
tar为:6 --> 4
tar为:7 --> 5
tar为:8 --> 6
tar为:9 --> 6
tar为:10 --> 7

2、求arr中大于tar的数的最小位置

//样例
    public static void main(String[] args) {
        int[] arr = new int[]{1,3,4,5,6,7,9};
        for(int i=0;i<=10;i++){
            int tar = i;
            System.out.println("tar为:"+tar+" --> "+ new Test().f3(tar,arr));
        }
    }
    public int f3(int tar, int[] arr) {
        int l=0,r=arr.length;
        while(l<r){
            int mid = l+(r-l)/2;
            if(arr[mid]>tar){
                r=mid;
            }else if(arr[mid]<tar){
                l=mid+1;
            }else {
                l=mid+1;
            }
        }
        return l;
    }
//结果
tar为:0 --> 0
tar为:1 --> 1
tar为:2 --> 1
tar为:3 --> 2
tar为:4 --> 3
tar为:5 --> 4
tar为:6 --> 5
tar为:7 --> 6
tar为:8 --> 6
tar为:9 --> 7
tar为:10 --> 7

三、最后有兴趣的可以试一下若arr中的数非正序,而是逆序的情况

//样例
    public static void main(String[] args) {
        int[] arr = new int[]{9,7,6,5,4,3,1};
        for(int i=0;i<=10;i++){
            int tar = i;
            System.out.println("tar为:"+tar+" --> "+ new Test().f4(tar,arr));
        }
    }

1、求arr中小于等于tar的数的最小位置

2、求arr中小于tar的数的最小位置

3、感兴趣的可以写一下这道题目(不用动态规划)

https://www.nowcoder.com/practice/218f3db1f66d465bbf9578625aa90785

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值