数的范围(二分题目思路与两种模板的使用)

卡朋名 2022-07-28 20:48:47

二分问题


二分问题分为整数二分和浮点二分。

整数二分

二分的本质是边界。假设在一个区间上定义了某种性质,整个区间可以被一分为二,使得这个性质在右半段区间满足而在左半段不满足。二分可以寻找边界,既可以找到左半段的右边界a,也可以找到右半段的左边界b

l       ab                  r
  xxxxxxxxxoooooooooooooooooooo

对于求两个边界,使用略微不同的模板。

情况一:在右半段寻找左边界(即寻找符合性质的第一个点)

每次将区间划分为[l, mid]和[mid + 1, r]([l, mid]是因为mid点可能就是左边界,所以这里不用[l, mid - 1]

int bsearch(int l, int r)
{
    while(l < r){
        int mid = (l + r) / 2;
        if(check(mid)) r = mid; //如果符合性质
        else l = mid + 1;
    }
    return l;
}

情况二:在左半段寻找右边界(即寻找不符合性质的最后一个点)

每次将区间划分为[l, mid - 1]和[mid, r](这是因为如果mid点符合性质,那么下次划分右边界肯定从mid-1开始)

int bsearch(int l, int r)
{
    while(l < r){
        int mid = (l + r + 1) / 2; 
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

mid = (l + r + 1) / 2这里,+1是因为除法下取整,在r = l + 1时更新l = mid时会出现l = mid = l的死循环。+1则相当于上取整,解决了这个隐患。

浮点二分

通常是函数求根、开方等问题,比较简单,while循环终止条件是精度e,更新时l和r都更新为mid即可。

...全文
33 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

137

社区成员

发帖
与我相关
我的任务
社区描述
大家一起打造学校的社区吧,加强学习沟通和进步!
javapythonc++ 高校 内蒙古·通辽市
社区管理员
  • c_university_357
  • 小学生一个
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧