二分法查詢的邊界問題

2021-07-25 13:56:32 字數 1732 閱讀 5953

對於不下降序列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...