直接上**吧,為了鞏固記憶,方便下次檢視
我是在練習劍指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 內給定乙個數,現在要小明猜這個數,如果小明猜對了,遊戲會提示猜對了,遊戲結束,如果小明猜錯了,它會提示小明的猜的數...