整数二分算法

一、整数二分算法

1.1 编写整数二分,记住下面的内容,代码也就游刃有余了!

(1) 首先找到数组的中间值,mid=(left+right)>>1,区间[left, right]被划分成[left, mid]和[mid + 1, right];如果是mid = l + r + 1 >> 1,区间[left, right]被划分成[left, mid - 1]和[mid, right]。

(2) 然后通过check(mid)判断中间值是不是满足这个性质,check是根据不同的题型编写的。

(3) 最后就能使用折半,缩小区间了,如果区间缩到了1,那么那个也就是答案。

二、整数二分算法的核心

2.1 二分的本质不是单调性

(1) 如果有单调性,一定可以二分,但是可以二分的题目,不一定有单调性。

(2) 二分的本质,问题一半满足,一半不满足,可以寻找到边界,这个边界可以将数组分为两个部分。因为整数边界必须做出选择,代码将有两个模板。而浮点数不是。

2.2 二分的主要思想是折半

二分一定是有解的,那个边界可以二分出来,但题目可能是无解的。

三、整数二分算法的代码模板

bool check(int x) {/* ... */} //检查x是否满足某种性质

// 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用:
int 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;
}
// 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) r = mid-1;//左边
        else l = mid;//右边
    }
    return l;
}
posted @ 2020-02-12 20:55  界内嘻哈  阅读(...)  评论(...编辑  收藏