整数二分:
整数二分有两种模板
//模板1
while (l < r) {
int mid = l + r >> 1;
if (比较条件) r = mid;
else l = mid + 1;
}
//模板2
while (l < r) {
int mid = l + r + 1 >> 1;//这里注意
if (比较条件) l = mid;
else r = mid - 1;
}
需要注意,如果更新条件为l = mid时,mid应该更新为l + r + 1 >> 1,不然程序会陷入死循环。
浮点数二分:
浮点数二分不需要像整数二分一样关注边界问题
浮点数二分有两种方式:
一、使用while循环将左右边界压缩到足够小的范围内
二、使用for循环一次性做足够多次数的二分
模板:
while (r - l > 1e-8) {
double mid = (l + r) / 2;
if (比较条件) r = mid;
else l = mid;
}
for (int i = 0; i < 100; i++) {
double mid = (l + r) / 2;
if (比较条件) r = mid;
else l = mid;
}