引用閆大佬的二分模板
二分模板一共有兩個,分別適用於不同情況。
演算法思路:假設目標值在閉區間[l, r]中, 每次將區間長度縮小一半,當l = r時,我們就找到了目標值。
版本1
當我們將區間 [l, r] 劃分成 [l, mid] 和 [mid + 1, r] 時,其更新操作是 r = mid 或者 l = mid + 1 ,計算mid時不需要加1。
等價於
int a=
;lower_bound
(a, a +5,
1)- a;
// 第乙個大於等於1的元素是1,下標是0
c++ **模板:
第一種
intbsearch_1
(int l,
int r)
return l;
}int
bsearch_1
(int l,
int r,
int arr,
int numbertofind)
printf
("%d"
,l);
return l;
}int
main()
;bsearch_1(0
,4,arr,2)
;return0;
}bsearch_1(0
,4,arr,2)
;這裡尋找的是2, 元素不在陣列裡,則會找到從左往右數第乙個 >= numbertofind的元素位置,就是arr[2]
bsearch_1(0
,4,arr,-10
);如果這裡尋找-
10,元素不在陣列裡,則會找到從左往右數第乙個 >= numbertofind的元素位置,就是arr[0]
bsearch_1(0
,4,arr,20)
;如果這裡尋找20
,元素不在陣列裡,會找到arr[
4]
版本2
當我們將區間 [l, r] 劃分成 [l, mid - 1] 和 [mid, r] 時,其更新操作是 r = mid - 1 或者 l = mid ,此時為了防止死迴圈,計算mid時需要加1。
c++ **模板:
第二種類
intbsearch_2
(int l,
int r)
return l;
}int
bsearch_1
(int l,
int r,
int arr,
int numbertofind)
printf
("%d"
,l);
return l;
}int
main()
;bsearch_1(0
,4,arr,4)
;return0;
}則會找到第乙個從右往左數 <= numbertofind的元素位置!
c++還有乙個二分函式
int a=
;upper_bound
(a, a +5,
1)- a// 第乙個大於1的元素是3,下標是1
二分查詢模板
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in...
二分查詢模板
例如陣列中查詢乙個數 二分查詢的前提是整個陣列是有序的 模板 int a n int l 0,r n 1 int mid,key while l r 另外還有一些二分查詢函式 a.函式模板 binary search arr,arr size indx c.函式功能 在陣列中以二分法檢索的方式查詢,...
二分查詢模板
二分查詢模板總共有兩個 將區間分為 l,mid l,mid l,mid mid 1,r mid 1,r mid 1 r 時,如下 while l r else 將區間分為 l,mid 1 l,mid 1 l,mid 1 mi d,r mid,r mid,r 時,如下 while l r else 對...