二分模板
整数二分的模板有很多,但出错大多是因边界判断出现问题,出现死循环。所以记一个统一的模板很重要。
模板有以下两种:
1.mid在左半边
while(l<r)
{
int mid=l+r>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
return a[l];
2.mid在右半边
while(l<r)
{
int mid=l+r+1>>1;//注意这里相比上面多加了1
if(check(mid))
l=mid;
else
r=mid-1;
}
return a[l];
我们如果分析出我们的结果靠近左半边,就用第一个;反之,用第二个,加 1 主要是为了防止死循环。
戒骄戒躁,百炼成钢!