二分查詢模板

2021-10-25 13:49:25 字數 1642 閱讀 3275

引用閆大佬的二分模板

二分模板一共有兩個,分別適用於不同情況。

演算法思路:假設目標值在閉區間[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 對...