劍指 二分查詢最左邊界和最右邊界

2021-10-20 21:14:33 字數 1212 閱讀 6451

直接上**吧,為了鞏固記憶,方便下次檢視

我是在練習劍指37中遇到的這題,思想是:找到k在陣列中的上下邊界,順便可以算出k的出現次數

class solution:

def getnumberofk(self, data, k):

# write code here

# hashmap 1

# 二分法? 找到最左邊的k. 找到最右邊的k 直接返回就行。剛好複習一下二分查詢的邊界

ind1 = self.findleftk(data, k)

if ind1 == -1:

return 0

ind2 = self.findrightk(data, k)

return abs(ind1-ind2)+1

def findleftk(self, data, k):

left = 0

right = len(data)-1

while left <= right:

mid = (right+left)//2

if data[mid] == k:

# 不返回。往左走

right = mid-1

elif data[mid] < k:

left = mid+1

else:

right = mid-1

#檢查有沒有出邊界

# 不僅判斷left出右邊界 還要判斷data[left]元素是否==k

return -1 if left>=len(data) or data[left]!= k else left

def findrightk(self,data, k):

left = 0

right = len(data) - 1

while left <= right:

mid = (right+left)//2

if data[mid] == k:

# 往右走

left = mid+1

elif data[mid] < k:

left = mid+1

else:

right = mid-1

# 不僅要判斷right有沒有出左邊界, 還要判斷data[right]的元素是否等於k

return -1 if right < 0 or data[right] != k else right

左右邊界二分查詢

二分查詢雖然是個基礎演算法,但是要考慮的還是蠻多的 二分的前提是避免死迴圈,所以邊界迭代的時候不能出現重複的值,由於整數型別的除法是向下取整,所以當left right 1的是時候就會造成mid left如果邊界迭代是left mid的話 就會陷入死迴圈,所以邊界迭代最好寫成下面的形式,再根據不同的...

常見的二分查詢 和找左右邊界

參考題解 二分查詢演算法細節詳解 記錄一下 左右全閉的寫法 int binary search int nums,int target else if nums mid target else if nums mid target 直接返回 return 1 intleft bound int nu...

二分查詢演算法(隨機, 最左, 最右)

1.定義 二分查詢演算法是一種效率較高的查詢演算法,每次查詢能把查詢範圍縮小一半,故也稱為折半查詢 查詢前提 所查區間有序 2.舉個栗子 現在小明在玩乙個猜數遊戲,遊戲會在 0 100 內給定乙個數,現在要小明猜這個數,如果小明猜對了,遊戲會提示猜對了,遊戲結束,如果小明猜錯了,它會提示小明的猜的數...