二分

1. 整数二分

1.1 找大于某个数的最小值

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = (l + r) >> 1;  // 区别:有无加1
        if (check(mid)) r = mid;  //区别
        else l = mid + 1;  //区别
    }
    return l;
}

1.2 找小于某个数的最大值

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = (l + r + 1) >> 1;  // 区别:有无加1
        if (check(mid)) l = mid;  //区别
        else r = mid - 1;  //区别
    }
    return l;
}

2. 浮点数二分

double bin_search(double l, double r)
{
    while (r - l > 1e-8)  // r与l的间隔小于1e-8
    {
        double mid = (l + r) / 2;  // 不需要考虑加一的事情
        if (mid * mid * mid >= n) r = mid;
        else l = mid;  // r和l都是mid
    }
    return l;
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄