最近做題做二分老是卡,於是總結一下:
本人二分做題不多,只遇到過三種情況,如有錯誤請大佬指正:
1、遞增序(即若(0,x)位置滿足條件,(x + 1, n)均不滿足),找最後乙個滿足條件的位置,如找滿足某條件的最大長度。
2、遞減序(即若(x + 1, n)位置滿足條件,(0, x)均不滿足)找第乙個滿足條件的位置,如找滿足某條件的最小值。
3、區域性滿足,找任意乙個遞增和遞減的交界點。
下面假設bool check(int n)當位置滿足條件時返回true,否則返回false.
1、遞增,找最後乙個位置:(這種打法不需要額外確認邊界條件,用ans即可判斷)
目前找到的最樸實的**,雖然每次搜尋要比單邊界多走一次,但是易於掌握,已儲備為個人模板:這個是學資料結構時,最開始學的二分**,結果後來把這種方法忘了,還是不能忘本。。
用ans記錄最終結果即可。
ans =-1
;//-1表示沒找到
while
(l <= r)
else
}return ans;
2、遞減,找第乙個位置
**1:樸實版:(這種打法不需要額外確認邊界條件,用ans即可判斷)
ans =-1
;//-1表示沒找到
while
(l <= r)
else
}return ans;
**2:單邊界移動**(這種打法需要額外確認邊界條件,需要最後再check一下)**
while
(l < r)
else
}int ans =-1
;//-1表示沒找到if(
cheack
(l))ans = l;
return ans;
3、既有遞增,又有遞減,判斷峰值(下面的**假設左邊遞增,右邊遞減):
while
(l < r)
return l;
二分的模板(花式二分)
對於不下降序列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 我們可以...