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,从而避免了死循环。
  • 实际应用建议:
    要是题目要求的是满足条件的第一个元素(最小值),就使用模板一。
    若题目要求的是满足条件的最后一个元素(最大值),则使用模板二。
    要留意边界条件,防止出现数组越界的情况。
posted @ 2025-05-29 16:54  寻龙诀  阅读(44)  评论(0)    收藏  举报
//页脚烟花效果 //雪花飘落