关于二分的花样写法的思考

  作为一名垃圾OI选手,初学二分被巨佬的花样二分搞得自闭,于是稍作研究,试图理解不同写法的意义,于是有了下文,欢迎指出错误,共同学习。

终止条件:while(l <= r)

答案位置:    l      

我们来思考一下为什么?

If(a[mid] < x)我们没有让l == mid,而是l = mid+1

对于整数上的二分而言l向右一定包含答案

而当循环结束时,答案一定在l上

当a[l]==x时我们依然把右区间左移

这可以理解为左闭右开

我们来修改一下:

终止条件:while(l < r)

答案位置:  l == r

Ifa[mid] < x)我们依然使l = mid+1

同样l向右一定包含答案

a[l]==x时我们不把右区间左移,

则答案在r的右侧(包含r

而当循环结束时,答案一定在l

这可以理解为左闭右闭

继续修改:

终止条件:while(l + 1 < r)

答案位置:        r

Ifa[mid] < x)我们依然使l = mid

已知mid不是答案,所以答案在l向右

a[mid] >= x时我们不把右区间左移,

则答案在r的右侧(包含r

而当循环结束时,答案一定在r

左开右闭

再修改:

终止条件:while(l  < r)

答案位置:       l == r

Ifa[mid] <= x)我们使l = mid

(因为mid可能是答案)

那么l向右一定包含答案

a[mid] > x(mid一定不是答案)

我们把右区间从mid左移,

则答案在r的左侧(包含r

则当循环结束时,答案一定在lr

左闭右闭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章