注意點:
- 跳出時都有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...