二分法中mid的处理以及STL二分函数

若我们需要在单调递增序列中找 x 或 x 的后继 的 mid 计算方法:

         实现  使用场合可能出现的问题        
mid = (left + right) / 2

left >= 0, right >= 0,

left + right无溢出

left + right可能溢出

负数情况下有向0取整问题

mid = left + (right-left)/2right - left 无溢出     若right 和left都是大数且一正一负,right - left可能溢出
mid = (left + right) >> 1left + right无溢出若left和right都为大数,left + right可能溢出

三种方法各有优缺点,综合起来,mid = (left + right) >> 1 更好一些

若需要找 x 或 x 的前驱,则用 mid = (left + right + 1) >> 1 即可

关于对应的STL函数:

(1)upper_bound() : 查找第一个大于 x 的元素的位置,pos = upper_bound(a, a + n, x) - a;

(2)lower_bound() : 查找第一个等于或大于 x 的元素;

(3)upper_bound() - lower_bound() : 计算单调序列中 x 的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Valueyou24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值