若我们需要在单调递增序列中找 x 或 x 的后继 的 mid 计算方法:
实现 | 使用场合 | 可能出现的问题 |
mid = (left + right) / 2 | left >= 0, right >= 0, left + right无溢出 | left + right可能溢出 负数情况下有向0取整问题 |
mid = left + (right-left)/2 | right - left 无溢出 | 若right 和left都是大数且一正一负,right - left可能溢出 |
mid = (left + right) >> 1 | left + right无溢出 | 若left和right都为大数,left + right可能溢出 |
三种方法各有优缺点,综合起来,mid = (left + right) >> 1 更好一些
若需要找 x 或 x 的前驱,则用 mid = (left + right + 1) >> 1 即可
关于对应的STL函数:
(1)upper_bound() : 查找第一个大于 x 的元素的位置,pos = upper_bound(a, a + n, x) - a;
(2)lower_bound() : 查找第一个等于或大于 x 的元素;
(3)upper_bound() - lower_bound() : 计算单调序列中 x 的个数。