03基础算法:整数二分
整数二分算法
|
|
模板一:
while (l < r)
{
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
使用场景:
当你要查找的目标值处于左半部分,也就是需要找到满足条件的最小值时,适合运用这个模板。
特性:
mid采用向下取整的方式计算,即mid = floor((l + r)/2)。
一旦check(mid)的结果为真,就把右边界更新为mid。
此模板最终能收敛到满足条件的最小值。
模板二:
while (l < r)
{
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
使用场景:
当你要查找的目标值处于右半部分,也就是需要找到满足条件的最大值时,这个模板是不错的选择。
特性:
mid通过向上取整的方式计算,即mid = ceil((l + r)/2)。
若check(mid)的结果为真,就把左边界更新为mid。
该模板最终会收敛到满足条件的最大值。
关键差异总结:
- 中间值计算方式:
模板一:mid = (l + r)/2,是向下取整。
模板二:mid = (l + r + 1)/2,为向上取整。 - 区间更新策略:
模板一:向左收缩,用于查找最小值。
模板二:向右收缩,用于查找最大值。 - 防止死循环:
模板一:由于向下取整,mid始终小于r,所以不会出现死循环。
模板二:借助向上取整,mid始终大于l,从而避免了死循环。 - 实际应用建议:
要是题目要求的是满足条件的第一个元素(最小值),就使用模板一。
若题目要求的是满足条件的最后一个元素(最大值),则使用模板二。
要留意边界条件,防止出现数组越界的情况。

浙公网安备 33010602011771号