二分是乙個看似很簡單的搜尋演算法,但也是有講究的,所以在這裡,我整理一下模板
這個模板有幾個易錯點,我們挨個看看:
(1)l = mid +1, r = mid - 1 習慣性的錯過mid
錯的原因很簡單,就是因為你每(l+r)/2一次,你就少了乙個mid,因為你這樣寫,無論如何取不到mid,所以有些情況你就會錯過最優解。
(2)mid = (l + r + 1) / 2 與 mid = (l + r) / 2
這樣寫是為了避免死迴圈
我們看模板1, 如果 mid = (l + r) / 2 的話,當 l = 3,mid = 3, r = 4的時候,觸發l = mid這個條件,l 一直等於3,一直出不去迴圈
反觀模板2,如果l = 3, mid = 3, r = 4; 觸發 l = mid + 1, l == r 退出迴圈, 觸發 r = mid,l == r退出迴圈所以模板一需要mid = (l + r) /2;
while(l < r)
while(l < r)
(3)a[mid] < x, a[mid] > x 即帶不帶等號
這個是需要根據題意來定的,比如pta advanced level practice 10,尋找乙個等於n1這個數的進製,所以無論大於n1還是小於n1,等於都在區間之內
二分的模板(花式二分)
對於不下降序列a,n為序列a元素的個數,key為關鍵字 1.求最小的i,使得a i key,若不存在,則返回 1 int binary search 1 inta,intn int key if a r key returnr return 1 2.求最大的i,使得a i key,若不存在,則返回 ...
二分答案模板
include include 必須包含的標頭檔案 using namespace std int main int tmp upper bound point,point 5,7 point 按從小到大,7最多能插入陣列point的哪個位置 printf d n tmp tmp lower bou...
模板 二分答案
二分答案一般使用在求解符合條件的最小值或者最大值上面,當我們遇到這兩個問題的時候,一般都可以使用二分答案來解決問題。二分答案就是通過對所有可能的答案區間進行折半查詢,不斷縮減範圍,最終確定答案的方法。求最小值 intbinary int left,int right return left 我們可以...