二分法的几种形式
一般形式
要求找到结果返回index,否则返回-1
def search(arr, target):
lo = 0
hi = len(arr) - 1
while lo <= hi:
mid = lo + (hi - lo) // 2 # avoid overflow
if target > arr[mid]:
lo = mid + 1
elif target < arr[mid]:
hi = mid - 1
else:
return mid
return -1
多个结果找最前
有多个结果,要求返回第一个的index
def search(arr, target):
lo = 0
hi = len(arr) - 1
while lo < hi:
mid = lo + (hi - lo) // 2 # approaching to the left
if target <= arr[mid]:
hi = mid # hi is the walker
else:
lo = mid + 1 # lo is the anchor
return hi
多个结果找最后
有多个结果,要求返回最后一个的index
def search(arr, target):
lo = 0
hi = len(arr) - 1
while lo < hi:
mid = lo