二分搜索的三种模板

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

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

这个总结直接进行记忆

相关文章
|
关系型数据库 MySQL 数据挖掘
MYSQL日期与时间函数的实用技巧
MYSQL日期函数与时间函数是数据库操作的关键工具,可轻松处理、查询、比较和格式化日期时间数据。它们能提取日期的年、月、日等部分,便于筛选和统计;同时,也能处理时间数据,如计算时间差、获取当前时间,助力用户更好地管理时间信息。掌握这些函数,不仅能提升数据库操作效率,还能为数据分析和报表生成提供有力支持。无论初学者还是资深数据库管理员,精通MYSQL的日期和时间函数都至关重要,以满足各种数据处理需求,确保数据的准确性和高效性。
898 0
|
人工智能 数据管理 API
阿里云牵头制定IEEE《行业大模型管理平台标准》,促进行业大模型生态发展
阿里云牵头在IEEE人工智能分委会制定《行业大模型管理平台标准》,旨在规范平台架构、功能及性能评估,解决行业应用中的共识缺失问题。该标准涵盖模型管理与应用工具的关键功能要求,并提供汽车、智能电网和传媒等领域的部署案例指导,以促进平台与行业用户的接口互通。多家企业和研究机构共同参与了标准制定工作,欢迎更多伙伴加入,共促产业发展。
541 9
|
编解码 算法 Python
ImportError: cannot import name ‘_update_worker_pids’ from ‘torch._C’
ImportError: cannot import name ‘_update_worker_pids’ from ‘torch._C’
293 0
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
769 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的未来:自动化与人工智能的融合
在本文中,我们将一起踏上一段激动人心的旅程,探索软件测试领域的未来趋势。从手工测试的繁琐到自动化测试的便捷,再到人工智能(AI)技术的引入,我们将揭示这些变革如何影响测试流程、提升效率并减少错误。文章将深入浅出地分析自动化测试工具的进步和AI技术如何赋能软件测试,预测未来可能的发展路径,并提供一些行业案例作为参考。无论你是软件测试领域的新手,还是寻求进阶知识的资深人士,这篇文章都将带给你新的启示和思考。
|
测试技术 PHP
大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程
最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程
365 0
|
存储 监控 安全
Linux日志管理工具:Logrotate(一)
Linux日志管理工具:Logrotate(一)
1329 0
|
安全 JavaScript 前端开发
恶意软件警报:BitRAT和Lumma Stealer伪装成假浏览器更新
恶意软件警报:BitRAT和Lumma Stealer伪装成假浏览器更新
|
XML IDE 开发工具
13. 【Android教程】文本框 TextView
13. 【Android教程】文本框 TextView
330 2
|
弹性计算 监控 网络协议
ECS操作系统监控
ECS操作系统监控
406 2