二分搜索的三种模板

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

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

这个总结直接进行记忆

相关文章
|
4月前
树状数组模板
树状数组模板
19 0
|
15天前
|
Python
{二分模板}
{二分模板}
6 0
|
4月前
线段树模板
线段树模板
22 0
|
8月前
|
机器学习/深度学习
P1873 砍树(二分查找模板)
P1873 砍树(二分查找模板)
72 0
|
11月前
|
存储 人工智能 算法
Trie树模板与应用
Trie树模板与应用
64 0
Trie树模板与应用
|
12月前
|
人工智能
|
12月前
|
人工智能
|
12月前
|
存储 算法 C++
单调栈模板总结及应用
单调栈模板总结及应用
76 0
二分查找(my理解和模板)
之前先学了y总的二分,后来又看了代码随想录的,感觉代码随想录的更好记忆
73 0