Binary Search HW
HW Hack #1
def search_rotated_array(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
if arr[left] <= arr[mid]:
if arr[left] <= target < arr[mid]:
right = mid - 1
else:
left = mid + 1
else:
if arr[mid] < target <= arr[right]:
left = mid + 1
else:
right = mid - 1
return -1
print(search_rotated_array([4,5,6,7,0,1,2], 0))
4
HW Hack #2
def find_first_and_last(arr, target):
def find_bound(is_first):
left, right = 0, len(arr) - 1
result = -1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
result = mid
if is_first:
right = mid - 1
else:
left = mid + 1
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return result
first = find_bound(True)
if first == -1:
return -1
last = find_bound(False)
return (first, last)
print(find_first_and_last([1, 2, 2, 2, 3, 4, 5], 2))
(1, 3)
HW Hack #3
def search_smallest_element(arr, target):
left, right = 0, len(arr) - 1
result = -1
while left <= right:
mid = (left + right) // 2
if arr[mid] >= target:
result = arr[mid]
right = mid - 1
else:
left = mid + 1
return result
print(search_smallest_element([1, 3, 5, 7, 9], 6))
7