二分查找
1.基础二分(严格单调)
搜索范围是闭区间[left, right],所以下面循环带等号
def binary_search(arr, target):
left, right = 0, len(arr)-1
while left <= right:
mid = left + (right-left) // 2
if arr[mid] == target:
return mid
elif arr[mid] > target:
right = mid-1
elif arr[mid] < target:
left = mid+1
return -1
2.寻找第一个出现的
搜索范围是开区间[left, right),所以下面循环不带等号
返回的是left,注意如果目标不存在的情况
def binary_search_first(arr, target):
left, right = 0, len(arr)
while left < right:
mid = left + (right-left)//2
if arr[mid] >= target:
right = mid
elif arr[mid] < target:
left = mid+1
if arr[left] == target:
return left
else:
return -1
3.寻找最后一个出现的
利用基础二分,向后遍历
def binary_search_last(arr, target):
index = binary_search(arr, target)
if index == -1:
return -1
for i in range(index, len(arr)):
if arr[i] == target:
index = i
else:
break
return index