整数二分模板

41 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

注意:二分的前提是有序

模板一

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用
void bsearch_1(int l, int r) //模板一
{
    while(l < r)
    {
        int mid = l + r >> 1;
        if(check(mid)) r = mid // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}

模板二

// 区间[l,r]被划分成[l,mid - 1]和[mid, r]时使用
void bsearch_2(int l,int r)
{
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

分享一个我觉得最容易理解的说法 假设有一个总区间,经由我们的 check 函数判断后,可分成两部分, 这边以o作 true,.....作 false 示意较好识别
如果我们的目标是下面这个v,那么就必须使用模板 1
................vooooooooo
假设经由 check 划分后,整个区间的属性与目标v如下,则我们必须使用模板 2
oooooooov...................
注:v也是true的