[模板]二分答案

1.使用場景

二分答案通常使用在求解符合條件的最小值或者最大值上面,當咱們遇到這兩個問題的時候,通常均可以使用二分答案來解決問題。函數

2.什麼是二分答案

二分答案就是經過對全部可能的答案區間進行折半查找,不斷縮減範圍,最終肯定答案的方法。code

3.求最小值

//求最小值
int binary(int left, int right) {
    int mid;
    while(left < right) {
        mid = (right + left) / 2;
        if (check(mid)) right = mid;
        else left = mid + 1;
    }
    return left;
}

咱們能夠知道,要求最小值,那麼所知足條件的值賦值給右邊界,不知足的值加一賦值給左邊界,當left == right或者left > right時,則說明已經查詢到符合的最小值。class

4.求最大值

//求最大值
int binary(int left, int right) {
    int mid;
    while(left < right) {
        mid = (right + left + 1) / 2;
        if (check(mid)) left = mid;
        else right = mid - 1;
    }
    return left;
}

一樣,要求最大值,那麼就須要捨棄符合條件的較小的值,即將左邊界賦值符合條件的點,右邊界賦值不符合條件的值減一。不斷查詢下去,則最後剩下符合條件最大值。其中mid = (right + left + 1) / 2是爲了防止無限循環,由於當left = right + 1時恰好符合條件,left = (right + left) / 2,就會無限循環。循環

5. check函數構思

咱們既然選擇了使用二分法來求解,那麼咱們在check的時候,應該是在咱們已知答案的狀況下去確認答案,即不是從通常思考方向設想,而是驗證。check函數每每是基於假定知道答案,來驗證是否正確。方法

相關文章
相關標籤/搜索