品味二分查詢

2021-10-21 14:59:55 字數 1629 閱讀 5983

int

binarysearch

(int

nums,

int target)

return-1

;}

1、為什麼 while 迴圈的條件中是 <=,而不是 <?

2、為什麼 left = mid + 1,right = mid - 1?我看有的**是 right = mid 或者 left = mid,沒有這些加加減減,到底怎麼回事,怎麼判斷?

class

solution

:def

search

(self, nums, target)

->

int:

'''尋找元素'''

l, r =0,

len(nums)-1

while l<=r:

mid = l +

(r - l)//2

if nums[mid]

==target:

return mid #注意

elif nums[mid]

r=mid+

1elif nums[mid]

>target:

l=mid-

1return-1

#注意def

left_bound

(self,nums, target)

:'''尋找左邊界'''

l,r=0,

len(nums)-1

while l<=r:

mid = l +

(r - l)//2

if nums[mid]

==target:

r=mid-

1#注意,因為是尋找左邊界,所以縮小r,使l最終指向結果

elif nums[mid]

l=mid+

1elif nums[mid]

> target:

r=mid-

1#檢查l的合法性if0

>l or l>

len(nums)-1

or nums[l]

!=target:

return-1

else

:return l #注意

defright_bound

(self,nums, target)

:#尋找右邊界

l,r=0,

len(nums)-1

while l<=r:

mid = l +

(r - l)//2

if nums[mid]

==target:

l=mid+

1##注意,因為是尋找右邊界,所以增大l,使r最終指向結果

elif nums[mid]

l=mid+

1elif nums[mid]

> target:

r=mid-

1#檢查r的合法性if0

>r or r>

len(nums)-1

or nums[r]

!=target:

return-1

else

:return r #注意

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

二分查詢及變種二分查詢

二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...