基础算法:二分模板

基础版本-整数

//第一种情况,最后答案是r
public int search(long l, long r) {
    while(l<r){
        long mid=l+r>>1;
        //int 版本 : int mid = l+(r-l)/2
        if(check(mid)){
            r = mid
        }
        else{
            l = mid+1
        }
    }
}

//第二种情况,最后答案是l
public int search(long l, long r) {
    while(l<r){
        long mid = l+r+1>>1;
        if(check(mid)){
            l = mid
        }
        else{
            r = mid-1
        }
    }
}

浮点数二分

double search(double l, double r)
{
    final double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        //浮点数的二分能精确取到l和r的中间值,所以不用补1
        //整数二分是因为二分是像下取整,如果l=r-1,那么r+l>>1==l,还是区间(l,r)死循环了
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注