要在有序陣列中找某個數,這個數隻出現一次
這個寫法有三個點需要注意
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...