二分答案通常使用在求解符合條件的最小值或者最大值上面,當咱們遇到這兩個問題的時候,通常均可以使用二分答案來解決問題。函數
二分答案就是經過對全部可能的答案區間進行折半查找,不斷縮減範圍,最終肯定答案的方法。code
//求最小值 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
//求最大值 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
,就會無限循環。循環
咱們既然選擇了使用二分法來求解,那麼咱們在check的時候,應該是在咱們已知答案的狀況下去確認答案,即不是從通常思考方向設想,而是驗證。check函數每每是基於假定知道答案,來驗證是否正確。方法