二分查找算法模板

二分算法思想

我們目標區間定爲[l, r], 每次縮小一半的空間,知道l = r時我們就找到目標值

整數二分

版本1

當我們把區間劃分爲[l, mid]和[mid + 1, r]時,即我們每次令r = mid或l = mid + 1;
算法模板

int bsearch_1(int l, int r)
{
    while(l < r)
    {
        int mid = (l + r) >> 1; //相當於(l + r) / 2
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

版本2

當我們把區間劃分爲[l, mid-1]和[mid, l]時,即我們每次令r = mid-1或者l = mid;
算法模板

int bsearch_1(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;
}

注意以上爲整數的二分需要特別注意防止死循環
簡便記法,當mid賦值給r時不需要+1,當mid賦值給l時需要+1;

浮點數二分

bool check(double x) {/* ... */} // 檢查x是否滿足某種性質

double bsearch_3(double l, double r)
{
    const double eps = 1e-6;   // eps 表示精度,取決於題目對精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

文章參考:https://www.acwing.com/blog/content/31/
個人學習使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章