二分查詢模版 必背

2021-09-23 23:41:52 字數 2802 閱讀 2452

注意點:

- 跳出時都有lo + 1 == hi統一返回lo + 1或hi

- lo = -1 and hi = nums.size()和 lo = 0 and hi = nums.size() - 1取中時一致

/*為什麼返回 `lo+1`,而不是 `hi`?(退出迴圈時有 lo + 1 == hi)

模板開始時將 (lo, hi) 看做是乙個開區間,通過不斷二分,最終這個區間中只會含有乙個值,即 (lo, hi]

返回 lo+1 的含義是,結果就在 lo 的下乙個;

在迭代的過程中,hi 會從開區間變為閉區間,而 lo 始終是開區間,

返回 lo+1 顯得更加統一。

當然,這跟迭代的寫法是相關的,你也可以使最終的結果區間是 [lo, hi)nums[mid]<=v,

這取決於個人習慣。

*/int

binary_search

(vector<

int> nums,

int n)

if(hi == nums.

size()

)return-1

;//lo+1 = hi,防止return時訪問越界

return nums[lo+1]

== n ? lo+1:

-1;}

//滿足條件int

lowwer_bound

(vector<

int> nums,

int n)

return lo +1;

}//滿足條件<=lo往右,=繼續往右找到[low,high)6667[2,3)

intupper_bound

(vector<

int> nums,

int n)

return lo +1;

}int

main()

;auto ret =

blowwer_bound

(test,10)

;//10,下標已經越界,但和下題不同,下題要求找不到返回的是-1

cout << ret;

}

做到題測試一下,先別看答案。

leetcode練習:34. find first and last position of element in sorted array

int

lowwer_bound

(vector<

int> nums,

int n)

if(hi == nums.

size()

)return-1

;return nums[hi]

== n ? hi :-1

;}intupper_bound

(vector<

int> nums,

int n)

if(lo ==-1

)return-1

;return nums[lo]

== n ? lo :-1

;}vector<

int>

searchrange

(vector<

int>

& nums,

int target)

附上常見的寫法,其實本質是一樣的:

template

<

typename t>

intbinarysearch

(vector

&vec, t key)

//沒找到返回-1

return-1

;}

擴充套件:
/*

二分查詢最優解的模板:

在一定精度下,求滿足條件 c 的最大/小解 x

注意點:

- 初始化上下界:

求最大值時,將下界 lo 初始化為乙個特殊的可行解;上界初始化為乙個不滿足條件的解

求最小值時,反之

- 一般這種最優解問題會提供精度要求,需要在返回時處理

- 最大值用「下取整」 floor(ret * 1000) / 1000 ——三位精度,floor: 地板

- 最小值用「上取整」 ceil(ret * 1000) / 1000 ——三位精度,ceil: 天花板

*//*例 1:

求大於 目標值 v(>0) 的最小值,精確到 3 位小數

*/double

min_bigger

(double v)

// 因為 hi 在解空間中(hi 必大於 v),所以返回 hi

return

ceil

(hi *

1000)/

1000

;// 三位精度

}/*例 2:poj no.1064

有 n 條繩子,長度分別為 li。如果從它們中切割出 k 條長度相同的繩子,求這 k 條繩子的最大長度。答案保留 2 位小數。

*/class

solution

// 因為 lo 在解空間中,所以返回 lo

return

floor

(lo *

100)

/100;}

private

:bool

c(vector<

double

> ls,

double mid,

double k)

return n >= k;

// n >= k 說明還有加大的空間,所以當 c 返回 true 時,lo = mid}}

;

二分查詢模版

用於一般的二分查詢 public static intbinsearch2 int arr,int target if arr mid target else return 1 1 為啥是 lo mid 1,hi mid 1 而不是 lo mid,hi mid 呢?看迴圈條件 while lo hi...

二分查詢解題模版

常規 樸素的二分查詢 在一維陣列中查詢乙個數,有返回索引,無則返回 1 int binary search int arr,int n,int val else if arr mid val else return 1 變體1 可以總結為00001111問題,查詢滿足條件的第乙個1 int bina...

二分查詢 整數 模版

一段區間,定義一種性質使得區間被一分為二 二分查詢即為尋找滿足性質或不滿足性質的區間的邊界 區間被劃分為 l,mid 和 mid 1,r intbsearch 1 int l,int r 區間被劃分為 l,mid 1 和 mid,r intbsearch 2 int l,int r return l...