二分法|整数二分 vs 浮点数(小数)二分 总结
核心本质相同
都是不断缩小搜索区间,取中间值判断,舍弃一半不符合条件的区间。
差别在于循环终止条件、区间更新方式。
- 整数二分(找边界,最常用)
目标:在离散整数集合找满足条件的第一个/最后一个整数
- 循环条件: while(l < r)
- 分两类模板
- 找左边界(满足条件的最小数)
plaintext
mid = l + (r - l) / 2;
if(check(mid)) r = mid;
else l = mid + 1;
- 找右边界(满足条件的最大数)
plaintext
mid = l + (r - l + 1) / 2;
if(check(mid)) l = mid;
else r = mid - 1;
- 特点
- 区间是离散的点,mid 一定是整数
- 必须+1 / -1,不然死循环
- 结束时 l == r ,就是答案
- 浮点数(小数)二分
目标:求连续区间内的一个近似值(平方根、方程解)
- 循环条件: while(r - l > eps)
eps 是精度,比如 1e-6 、 1e-8 - 模板
plaintext
mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid;
- 特点
- 实数是连续的,没有整数那种"相邻断点"
- mid 是小数,不用 +1、-1
- 区间不断靠近,只要区间足够小就可以停止
- 输出 l 或者 r 都可以,二者几乎相等
- 有时候要补充一个1.0来让它变成浮点型
一句话对比速记
- ✅ 整数二分:离散点,靠 l<r,需要加减1防死循环,求精确整数边界
- ✅ 小数二分:连续区间,靠精度eps,不用加减,求近似值