二分的本質:找到丟棄一半的規則
二分只有下面兩種情況
二分模板說明
迴圈必須是l < r
if判斷條件看是不是不滿足條件, 然後修改上下界
若是r = mid - 1, 則前面mid 語句要加1(記住與r平衡就行)
出迴圈一定是l == r,所以l和r用哪個都可以
有的時候如果是單調的,l = mid + 1,一直加到最後乙個,此時不用擔心越界,因為l == r了,退出迴圈
**模版
// 判斷條件很複雜時用check函式,否則if後直接寫條件即可
bool
check
(int mid)
// 能二分的題一定是滿足某種性質,分成左右兩部分
// if的判斷條件是讓mid落在滿足你想要結果的區間內
// 找滿足某個條件的第乙個數 即右半段
intbsearch_1
(int l,
int r)
return l;
}// 找滿足某個條件的最後乙個數 即左半段
intbsearch_2
(int l,
int r)
return l;
}
其實二分並不一定侷限在有序區間內,只要區間具有二段性
就可以二分,即區間具有某個性質可以將區間分為兩段,使得每次搜尋時都能將區間縮小而且保證答案仍在區間內
例如:
左邊一段的點都滿足乙個性質:上面的點比nums[n - 1]大
右邊一段的點都滿足乙個性質:上面的點不比nums[n - 1]大
這就是所謂的二段性
具體例項請看例2旋轉陣列的最小數字
原題鏈結
;題目描述
演算法
(二分)o(l
ogn)
o(logn)
o(logn
)**
class
solution
return rotatearray[l];}
};
link
class
solution
return numbers[l];}
};
stl庫函式原始碼學習lower_bound和upper_bound演算法
下面的x可以是整數,也可以是小數
// 返回第乙個》=x的下標
lower_bound
(a.begin()
, a.
end(
), x)
- a.
begin()
;// 返回最後乙個<=x的下標
upper_bound
(a.begin()
, a.
end(
), x)
- a.
begin()
-1;// -1個下標
// 返回第乙個》x的下標
upper_bound
(a.begin()
, a.
end(
), x)
- a.
begin()
;
二分的模板(花式二分)
對於不下降序列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 我們可以...