二分查找算法模板(非常好用)

版本1

这种适用于答案落在左半区间,一般适用于求解最小化最大值

当区间[l, r]的更新操作是r = mid; l = mid + 1;时,计算mid时不需要加1。
C++ 代码模板:

int bsearch_1(int l, int r)
{
    while (l < r) //l=r结束
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

版本2

这种适用于答案落在右半区间,一般适用于求解最大化最小值

当区间[l, r]的更新操作是r = mid - 1; l = mid;时,计算mid时需要加1。
C++ 代码模板:

int bsearch_2(int l, int r)
{
    while (l < r)//l=r结束
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

 

原文地址:https://www.cnblogs.com/xiaoguapi/p/10364324.html