二分模板笔记

学习acwing中yxc的二分模板记录的笔记。

一. 二分模板分两种情况:

1. 找某区间左边界问题:

当mid在左边界到r之间时:

说明要找的左边界在mid左边,则r=mid;

否则l=mid+1; 

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;//当mid在左边界到r之间时
        else l = mid + 1;//当mid不在左边界到r之间时
    }
    return l;
}

2. 找某区间右边界问题:

当mid在l到右边界之间时:

 说明要找的右边界在mid右边

则l=mid;

否则r = mid-1;

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;//为什么要+1
        if (check(mid)) l = mid;//当mid在l到右边界之间时
        else r = mid - 1;
    }
    return l;
}

二 .  关于找右边界时为什么计算mid时要+1:

如果在二分过程中出现这种情况,mid一直逼近于r,mid和r刚好相邻时,比如mid在arr[5],r在arr[6],此时计算mid时,若不+1,则mid的结果会下取整得mid=5,此时mid的序号没变,会陷入死循环。

而+1,mid的结果会上取整得mid=6,则不会死循环。

三.  关于返回值为什么是l:

也可以是r,因为二分循环结束条件是r=l

二分结束前的状态只有两种:

1.当找左边界时:

( 由于是mid计算是向下取整,所以相邻时mid指向l)

此时无论是执行r=mid;还是l=mid+1;最终都会l=r;

2.当找右边界时:

 ( 由于是mid计算是向上取整,所以相邻时mid指向r)

此时无论是执行l=mid;还是r=mid-1;最终都会l=r;

综上:循环最终会因为r=l而结束,所以返回r还是l都行。

记忆:

左+r,右-l,rl相等停。

相关二分题:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值