二分法的邊界選擇

2021-10-05 04:52:25 字數 1720 閱讀 8090

要在有序陣列中找某個數,這個數隻出現一次

這個寫法有三個點需要注意

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)<< endl;

cout <<

find(9

, a,0,

9)<< endl;

return0;

}

找到乙個數字出現的區間,開始位置或者結束位置,或者插入位置

其實下面的這種寫法可以改寫成滿足上面的題目的**,所以下面這種寫法通用性更好。

int

find_begin

(int x,

int*a,

int begin,

int end)

else

if(a[m]

< x)

else

}return begin;

}int

find_back

(int x,

int*a,

int begin,

int end)

else

if(a[m]

< x)

else

}return begin;

}int

main()

;assert

(find_begin(0

, b,0,

10)==0

);assert

(find_begin(2

, b,0,

10)==3

);assert

(find_begin(3

, b,0,

10)==5

);assert

(find_begin(-

1, b,0,

10)==0

);assert

(find_begin(1

, b,0,

10)==3

);assert

(find_begin(20

, b,0,

10)==10);

assert

(find_back(0

, b,0,

10)==3

);assert

(find_back(2

, b,0,

10)==5

);assert

(find_back(3

, b,0,

10)==10);

assert

(find_back(-

1, b,0,

10)==0

);assert

(find_back(1

, b,0,

10)==3

);assert

(find_back(20

, b,0,

10)==10);

return0;

}

二分法的邊界問題

2.求最大的i,使得a i key 對於1的演算法,就是l邊界 左邊界 一直不滿足條件,r邊界在快結束時一定滿足條件,所以最後輸出r,然後區間不斷向左收,右邊界r不動。對於2,就是l左邊界一直不動,縮小右邊界,最後輸出左邊界,要注意的是向上取整。對於不下降序列a,n為序列a元素的個數,key為關鍵字...

二分法尋找左右邊界

尋找左邊界 陣列有序,且有重複 左閉右開 迴圈條件 left right 中間位置計算 mid left right left 1 左邊界更新 left mid 1 右邊界更新 right mid 返回值 nums left target left 1public static void main ...

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...