尽管python的bisect module很好用,但module要求输入数组是已经排序过的;尤其在刷leetcode二分法的问题时,这个条件并不常有,很多时候二分法还得自己写。先给出二分法实现的python 代码:
def binary_search(array, target):
left = 0
right = len(target) - 1
while(left <= right):
mid = (left + right) // 2
if array[mid] == target:
return mid
elif array[mid] < target:
left = mid + 1
else:
right = mid - 1
# return unsuccessful code
return -1
注意如果有多个target,上面这个实现会return任何一个target; 在有多个target的时候,二分法当然也可以return the leftmost target:
def binary_search_leftmost(A, T):
L = 0
R = len(array)
while L < R:
m = (L + R) // 2
if A[m] < T:
L = m + 1
else:
R = m
return L
很明显,这里和target比较的语句没有了(因为即使找到也不能立即停止),同时边界条件也进行了置换:左边在不满足时update (L = m + 1); 右边在满足条件时直接跳到当前。