對於不下降序列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
;
二分法的邊界問題
2.求最大的i,使得a i key 對於1的演算法,就是l邊界 左邊界 一直不滿足條件,r邊界在快結束時一定滿足條件,所以最後輸出r,然後區間不斷向左收,右邊界r不動。對於2,就是l左邊界一直不動,縮小右邊界,最後輸出左邊界,要注意的是向上取整。對於不下降序列a,n為序列a元素的個數,key為關鍵字...
二分法的邊界選擇
要在有序陣列中找某個數,這個數隻出現一次 這個寫法有三個點需要注意 int find int x,int a,int begin,int end else if a m x else return 1 intmain cout find 0 a,0,9 endl cout find 5 a,0,9 ...
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...