作为一名垃圾OI选手,初学二分被巨佬的花样二分搞得自闭,于是稍作研究,试图理解不同写法的意义,于是有了下文,欢迎指出错误,共同学习。
终止条件:while(l <= r)
答案位置: l
我们来思考一下为什么?
If(a[mid] < x)我们没有让l == mid,而是l = mid+1
对于整数上的二分而言l向右一定包含答案
而当循环结束时,答案一定在l上
当a[l]==x时我们依然把右区间左移
这可以理解为左闭右开
我们来修改一下:
终止条件:while(l < r)
答案位置: l == r
If(a[mid] < x)我们依然使l = mid+1
同样l向右一定包含答案
当a[l]==x时我们不把右区间左移,
则答案在r的右侧(包含r)
而当循环结束时,答案一定在l上
这可以理解为左闭右闭
继续修改:
终止条件:while(l + 1 < r)
答案位置: r
If(a[mid] < x)我们依然使l = mid
已知mid不是答案,所以答案在l向右
当a[mid] >= x时我们不把右区间左移,
则答案在r的右侧(包含r)
而当循环结束时,答案一定在r上
左开右闭
再修改:
终止条件:while(l < r)
答案位置: l == r
If(a[mid] <= x)我们使l = mid
(因为mid可能是答案)
那么l向右一定包含答案
当a[mid] > x时(即mid一定不是答案)
我们把右区间从mid左移,
则答案在r的左侧(包含r)
则当循环结束时,答案一定在l和r上
左闭右闭