二分搜尋的模板(一)

2021-08-18 01:17:57 字數 2112 閱讀 2111

二分搜尋是演算法搜尋一部分的重要內容。雖然變化多端,但仍有跡可循,有法可依。記錄一下在網上遇到的模板~

這個模版的核心是將二分搜尋(binary search)問題轉化成:在給定公升序陣列(沒有相同元素)中,尋找大於等於 target 值的最小索引或小於等於 target 值的最大索引。有幾點需要注意:

初始化:start = -1,end = array.length

迴圈判斷條件:start + 1 < end。 表示當指標指到兩個元素相鄰或者相交的時候, 迴圈停止。

求中間值:mid = start + (end - start) / 2,防止溢位。(python不用考慮,但python的除號是 //)

使用迭代而不是遞迴進行二分查詢,因為工程中遞迴寫法存在溢位的可能。

while終止條件應為 start + 1 < end 而不是 start <= end,start == end 時可能出現死迴圈。迴圈終止條件是相鄰或相交元素時退出。但是初始化時start < end,所以一定是start + 1 == end時退出迴圈。

該模板把陣列 -1 和 len(array) 的位置考慮在內:如果大於等於 target 值的最小索引不存在,則返回 len(array);如果小於等於 target 值的最大索引不存在,則返回 -1。

該模板的python**如下:

class

solution

:def

searchinsert1

(self, array, target)

:# 尋找大於等於 target 值的最小索引

ifnot array:

return

0

start =-1

end =

len(array)

while start +

1< end:

mid = start +

(end - start)//2

if array[mid]

< target:

start = mid

else

: end = mid

return end

defserachinsert2

(self, array, target)

:# 尋找小於等於 target 值的最大索引

ifnot array:

return

0

start =-1

end =

len(array)

while start +

1< end:

mid = start +

(end - start)//2

if array[mid]

> target:

end = mid

else

: start = mid

return start

題目:lintcode 60. search insert position & leetcode 35. search insert position

題目描述:給定乙個排序陣列a和乙個目標值target,如果在陣列中找到目標值則返回索引。如果沒有,返回到它將會被按順序插入的位置。你可以假設在陣列中無重複元素。

根據上面模板進行解題,即尋找大於等於 target 值的最小索引。python**如下:

class

solution

:def

searchinsert

(self, a, target):if

not a:

return

0

start, end =-1

,len

(a)while start +

1< end:

mid = start +

(end - start)//2

if a[mid]

< target:

start = mid

else

: end = mid

return end

二分搜尋模板

正如bfs dfs有模板,二分搜尋也有模板。模板一 左閉右開 l,r public void bianrysearch int l int r else return l 是g m 成立的最小值 模板二 左閉右閉 l,r public void bianrysearch int l int r el...

二分搜尋模板

int binary search int nums,int target else if nums mid target else if nums mid target 直接返回 return 1 搜尋區間是兩端閉區間。int left bound int nums,int target else...

二分的模板(花式二分)

對於不下降序列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,若不存在,則返回 ...