二分模板總結

2021-10-19 18:13:27 字數 1070 閱讀 1081

最近做題做二分老是卡,於是總結一下:

本人二分做題不多,只遇到過三種情況,如有錯誤請大佬指正:

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 我們可以...