作爲一名垃圾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上
左閉右閉