對於不下降序列a,n為序列a元素的個數,key為關鍵字:
1.求最小的i,使得a[i] = key,若不存在,則返回-1
int
binary_search_1
(inta,
intn
,int
key)if(
a[r]
==key
)returnr;
return-1
;}
2.求最大的i,使得a[i] = key,若不存在,則返回-1
int
binary_search_2
(inta,
intn
,int
key)if(
a[l]
==key
)returnl;
return-1
;}
3.求最小的i,使得a[i] > key,若不存在,則返回-1
int
binary_search_3
(inta,
intn
,int
key)if(
a[r]
>
key)
returnr;
return-1
;}
4.求最大的i,使得a[i] < key,若不存在,則返回-1
int
binary_search_4
(inta,
intn
,int
key)if(
a[l]
<
key)
returnl;
return-1
;}
實際上,對於3、4,也可以先判斷解是否存在,再進行二分查詢。
顯然,上面的**還不夠簡潔。下面給出我認為最簡潔的**:
1.
int
ans=
std::
lower_bound(a
,a+n
,key)-
a;ans=
(ans==n
||a[ans]!=
key)?-
1:ans;
2.
int
ans=
std::
upper_bound(a
,a+n
,key)-
a;ans=
(ans==0
||a[ans-1
]!=key)?-
1:ans-
1;
3.
int
ans=
std::
upper_bound(a
,a+n
,key)-
a;ans=
(ans==n
)?-1
:ans
;
4.
int
ans=
std::
lower_bound(a
,a+n
,key)-
a;ans=
(ans==0
)?-1
:ans-1
;
二分答案模板
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 我們可以...
二分查詢模板
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in...