二分的本质不是单调性!是区间,具有二段性
单调一定可以用二分做,但不单调有时也可以用二分,只要能把区间分开就可以(二段性)。
整数二分
最麻烦的是边界的考虑
算法思路
模板一(红色区域):
while(l<r)
{
int mid=(l+r+1)/2;
if(check(mid))l=mid;
else r=mid-1;
}
模板二(蓝色区域):
while(l<r)
{
int mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid+1;
}
注意问题:
1.为啥模板一里的mid要+1呢?当r=l+1,更新区间【l,mid】时mid=(l+l+1)/2(下取整)=l
2.if(check(mid))取true时,证明mid在check区间中,所以要把mid取上。
若为false,说明mid不能取,最多mid-1或者mid+1能取
浮点数二分
直接除就行
模板
while(r-l>1e-8)
{
double mid=(l+r)/2;
if(mid*mid>=x) r=mid;
else l=mid;
}