最簡二分模板 秒殺95 的二分題

2021-10-02 15:04:59 字數 2148 閱讀 1599

二分的本質找到丟棄一半的規則

二分只有下面兩種情況

二分模板說明

迴圈必須是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 我們可以...