二分搜索的三种模板

简介: 二分搜索的三种模板

1 查找target是否在数组中,没有返回-1

def binarySearch(nums, target):
    left, right = 0, len(nums) -1
    while left <= right:
        mid = (left + (right - left)) // 2
        if nums[mid] > target:
            right = mid - 1
        elif nums[mid] < target:
            left = mid + 1
        else:
            return mid
    # 没有就返回-1
    return -1

2 查找数组中第一个等于target的index, 没有返回-1

def binarySearch(nums, target):
    left, right = 0, len(nums) -1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] >= target:
            right = mid - 1
        elif nums[mid] < target:
            left = mid + 1
    if left < len(nums) and nums[left] == target:
      return left
    # 没有就返回-1
    return -1

查找最后一个等于target下标,没有返回-1

  while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] > target:
            right = mid - 1
        elif nums[mid] <= target:
            left = mid + 1
    if right >= 0 and nums[right] == target:
      return right
    # 没有就返回-1
    return -1

查找第一个大于等于target的小标,没有返回-1

 while left <= right:
   mid = left + (right - left )// 2
   if nums[mid] > target:
    right = mid - 1
   elif nums[mid] <= target:
    left = mid + 1
 if left < n:
  return left
 else:
  return -1

查找最后一个小于等于value的下标

结尾判断改为
 while left <= right:
   mid = left + (right - left )// 2
   if nums[mid] >= target:
    right = mid - 1
   elif nums[mid] < target:
    left = mid + 1
 if right >= 0:
  return right
 else:
  return -1

总结


所有的区间均为左闭右闭 [left, right]


  • 如果是找左边界,将等号挂在right分支上, 最后判断left

  • 如果是找右边界,将等号挂在left分支上, 最后判断right

非直接查找


  • 如果找大于目标的左边界,将等号挂在left分支,最后判断 left是不是 < len(nums)

  • 如果找小于目标的右边界,将等号挂在right分支,最后判断right是不是 >= 0

这个总结直接进行记忆

相关文章
|
6月前
树状数组模板
树状数组模板
37 0
|
4月前
|
算法
二分 模板
二分的另一个板子
34 1
|
5月前
|
Java Python
二分查找模板
二分查找模板
|
6月前
|
Python
{二分模板}
{二分模板}
23 0
|
6月前
线段树模板
线段树模板
44 0
|
机器学习/深度学习
P1873 砍树(二分查找模板)
P1873 砍树(二分查找模板)
109 0
|
算法
回溯算法 全排列模板
回溯算法 全排列模板
77 0
|
存储 算法
线段树模板与练习
线段树模板与练习
100 0
|
算法
树状数组模板与练习
树状数组模板与练习
97 0