二分搜尋是演算法搜尋一部分的重要內容。雖然變化多端,但仍有跡可循,有法可依。記錄一下在網上遇到的模板~
這個模版的核心是將二分搜尋(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,若不存在,則返回 ...