二分

二分

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;
}
相關文章
相關標籤/搜索