所謂模板只是爲了在解決相關問題時提供一個較好的出發點,具體細節還應根據具體的題目進行調整。
二分查找模板
二分查找在解題過程中經常出現,如查找target是否在給定的數組中存在、查找包含重複元素的數組中某一個數target對應的左右邊界或查找旋轉數組的旋轉點……相比較於線性掃描的實際複雜度,二分查找的時間度爲。
查找target在nums中是否存在?
def binarySearch(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
elif self.nums[mid] > target:
right = mid - 1
return -1
查找target在nums中的左邊界
def findLeftBound(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return left if left <= len(nums)-1 and nums[left] == target else -1
查找target在nums中的右邊界
def findRightBound(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
left = mid + 1
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return right if right >= 0 or nums[right] == target else -1
完整測試模板
class BinarySearch:
def __init__(self, nums, target):
self.nums = nums
self.target = target
def binarySearch(self):
left = 0
right = len(self.nums) - 1
while left <= right:
mid = left + (right - left) // 2
if self.nums[mid] == self.target:
return mid
elif self.nums[mid] < self.target:
left = mid + 1
elif self.nums[mid] > self.target:
right = mid - 1
return -1
def findLeftBound(self):
left = 0
right = len(self.nums) - 1
while left <= right:
mid = left + (right - left) // 2
if self.nums[mid] == self.target:
right = mid - 1
elif self.nums[mid] < self.target:
left = mid + 1
elif self.nums[mid] > self.target:
right = mid - 1
return left if left <= len(self.nums)-1 and self.nums[left] == self.target else -1
def findRightBound(self):
left = 0
right = len(self.nums) - 1
while left <= right:
mid = left + (right - left) // 2
if self.nums[mid] == self.target:
left = mid + 1
elif self.nums[mid] < self.target:
left = mid + 1
elif self.nums[mid] > self.target:
right = mid - 1
return right if right >= 0 or self.nums[right] == self.target else -1
if __name__ == "__main__":
# 簡單二分查找
# nums = [1,2,3,4,5,6]
# target = 2
# bs = BinarySearch(nums, target)
# print (bs.binarySearch())
# 查找左邊界
# nums = [1,2,2,2,3,4]
# target = 2
# bs = BinarySearch(nums, target)
# print (bs.findLeftBound())
# 查找右邊界
nums = [1,2,2,2,3,4]
target = 2
bs = BinarySearch(nums, target)
print (bs.findRightBound())
關於更多如邊界條件的設置等關鍵坑詳讀二分查找解題套路框架,強推!