一. 整数二分
做二分的时候先考虑chack函数怎么写,用来判断用哪个模板
模板1
当[l , r] 被划分为[l , mid ] 和[mid + 1 , r]
当chack(mid) 为 true时,r 等于mid,此时划分为[ l ,mid ]此区间包含mid
反之划分为[mid + 1,r ]因为mid满足性质所以 mid一定不是答案,可取到mid + 1;
int l = 0 , r = n - 1;
while( l < r )
{
int mid = (r + l) / 2;
if(chack(mid) ) r = mid; //chack判断mid是否满足性质
else l = mid + 1;
}
模板二
当[l , r] 被划分为[l , mid - 1] 和[mid , r]
当chack(mid) 为 true时,l 等于mid,此时划分为[mid ,r]此区间包含mid
反之划分为[l,mid - 1]因为mid满足性质所以 mid一定不是答案,可取到mid - 1;
这种情况会有边界问题 为防止发生死循环mid = ( l + r + 1) / 2;
int l = 0 , r = n - 1;
while( l < r)
{
int mid = (l + r + 1) / 2;
if(chack(mid) ) l = mid; //chack判断mid满足性质
else r = mid - 1;
}
二. 小数二分
小数二分没有边界问题
所以只有一个模板
while(l < r)
{
double mid = ( l + r) / 2;
if(chack(mid)) r = mid; //chack判断满足性质
else l = mid;
}