關於二分的花樣寫法的思考

  作爲一名垃圾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

左閉右閉

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