Binary Search 常用技巧总结

注意事项
  • 溢出: 取值时候需要防止溢出
  • 边界错误:需要注意的是,循环体外的初始化条件,循环体内部的迭代步骤,都必须遵循一致的区间规则
  • 死循环:错误的边界,使得不能从循环中正确退出。
第一类:需要查找的值和目标值完全相同
  • 写法一: 左闭右开区间: 注意right取值始终是在范围之外的值
def find(arr, target):
  left, right = 0, len(arr)
  while left < right:
    mid = left + (right - left)//2
    if arr[mid] == target: 
      return mid
    elif arr[mid] < target:
      left = mid + 1
    else:
      right = mid
  return -1
  • 写法二: 全部闭区间:注意right取值在范围之内
def find(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:
      left = mid + 1
    else:
      right = mid - 1
  return -1
第二类:查找第一个不小于目标值的位置,或者查找最后一个小于目标值的位置

需要查找的数值在数组中并不一定出现,或者出现但是并不一定唯一。

def binarysearch(arr, target):
  left, right = 0, len(arr)
  while left < right:
    mid = left + (right - left) // 2
    if arr[mid] < target:
      left = mid + 1
    else:
      right = mid
  return right

变形只需要修改返回值,返回right-1 即可

第三类:查找第一个大于目标值的数,可以变形为查找最后一个不大于目标值的数
def binarysearch(arr, target):
  left, right = 0, len(arr)
  while left < right:
    mid = left + (right - left) // 2
    if arr[mid] <= target:
      left = mid + 1
    else:
      right = mid
  return right
Reference

results matching ""

    No results matching ""