关于二分法的边界感悟-java实现

1.对于程序边界,你一定要维护住自己的标准,不能变。
2.注意循环不变量

package ShiyiQi;

/**
 * Created by xurui on 2017/11/7.
 */

class binarySearch{
    public int binarySearch(int arr[], int n, int target){
        //[]为数学上的双闭区间的意思
        int l = 0 , r = n-1;//在[l...r]的范围内寻找target
        while( l <= r ) {//当l == r的时候,区间[l..r]仍然是有效的
            int mid = (l+r)/2;
            if(target == mid)
                return mid;
            if(target > mid){
                l = mid + 1;//此时区间为[mid+1...r]
            }
            else {//target < mid
                r = mid-1; //此时区间为[l...mid-1]
            }
        }
        return -1;
    }
}
public class AlgorithmFir {
    public  static  void main(String [] args){
        int arr[] = {1,2,3,4,5,6,7,123,2342,15235214};
        binarySearch tt = new binarySearch();
        System.out.println("target:"+tt.binarySearch(arr,9,3));
    }

}
int l = 0 , r = n-1;

对于这一行代码,如果我想要变化

int l = 0 , r = n;

那么,相应的函数应该变为

class binarySearch{
    public int binarySearch(int arr[], int n, int target){
        //[)为数学上的左开右闭区间的意思
        int l = 0 , r = n;//在【l...r)的范围内寻找target
        while( l < r ) {//当l == r的时候,区间【l..r)仍然是有效的
            int mid = (l+r)/2;
            if(target == mid)
                return mid;
            if(target > mid){
                l = mid + 1;//此时区间为【mid+1...r)
            }
            else {//target < mid
                r = mid; //此时区间为【l...mid)
            }
        }
        return -1;
    }
}

TIPS:

这里有一个不容易被发现的bug,这是我在华东师范大学复试题目发现的,题目非常简单,大概就是计算排列组合C几几的问题,但是会溢出,解决的办法同这里的类似。代码行为

int mid = (l+r)/2;

大数相加会出现溢出,所以我们可以采用相减

int mid = l+(r-l)/2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值