Binary Search
Classic binary search, find a number (no dupes):
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
if nums[mid] < target:
left = mid+1
else:
right = mid
# Left would be the insertion point
return left
If we have dupes, we can find insertion point. This find leftmost index if dupes.
def binary_search(arr, target):
left = 0
right = len(arr)
while left < right:
mid = (left + right) // 2
if arr[mid] >= target:
right = mid
else:
left = mid + 1
return left
With bisect:
bisect.bisect_left(a, x)
To find directly after:
def binary_search(arr, target):
left = 0
right = len(arr)
while left < right:
mid = (left + right) // 2
if arr[mid] > target:
right = mid
else:
left = mid + 1
return left
Finds insertion point to retain sorted order
bisect.bisect_right(a, x)
Similar to bisect_left(), but returns an insertion point which comes after (to the right of) any existing entries of x in a.
Last updated