版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
1 int bsearch_1(int l, int r) 2 { 3 while (l < r) 4 { 5 int mid = l + r >> 1; 6 if (check(mid)) r = mid; 7 else l = mid + 1; 8 } 9 return l; 10 }
版本2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
C++ 代码模板:
1 int bsearch_2(int l, int r) 2 { 3 while (l < r) 4 { 5 int mid = l + r + 1 >> 1; 6 if (check(mid)) l = mid; 7 else r = mid - 1; 8 } 9 return l; 10 }
作者:yxc
链接:https://www.acwing.com/blog/content/31/
来源:AcWing
来源:https://www.cnblogs.com/sxq-study/p/12021084.html