二分答案一般使用在求解符合條件的最小值或者最大值上面,當我們遇到這兩個問題的時候,一般都可以使用二分答案來解決問題。
二分答案就是通過對所有可能的答案區間進行折半查詢,不斷縮減範圍,最終確定答案的方法。
//求最小值
int binary(int left, int right)
return left;
}
我們可以知道,要求最小值,那麼所滿足條件的值賦值給右邊界,不滿足的值加一賦值給左邊界,當left == right
或者left > right
時,則說明已經查詢到符合的最小值。
//求最大值
int binary(int left, int right)
return left;
}
同樣,要求最大值,那麼就需要捨棄符合條件的較小的值,即將左邊界賦值符合條件的點,右邊界賦值不符合條件的值減一。不斷查詢下去,則最後剩下符合條件最大值。其中mid = (right + left + 1) / 2
是為了防止無限迴圈,因為當left = right + 1
時剛好符合條件,left = (right + left) / 2
,就會無限迴圈。
我們既然選擇了使用二分法來求解,那麼我們在check的時候,應該是在我們已知答案的情況下去確認答案,即不是從一般思考方向設想,而是驗證。check函式往往是基於假定知道答案,來驗證是否正確。
二分答案模板
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 我們可以...
二分答案模板
include using namespace std int a 返回最後乙個小於k的數的下標 intfind1 int k return l 返回最後乙個小於等於k的數的下標 intfind2 int k return l 返回第乙個大於k的數的下標 intfind3 int k return ...