当前位置: 首页 > article >正文

数据结构与算法——二分查找

        二分查找算法常用于在具有单调性的数组中,以logn的时间复杂度快速查找某个目标值是否存在于该数组中,如果存在还能够返回目标值在数组中的索引下标,常见的二分查找算法有开区间写法、半开区间写法以及闭区间写法,这三种写法的区别是左右指针所指的值是否在二分查找的范围之内,开区间的二分查找的范围是(l,r),半开区间的二分查找的是(l,r]或者[l,r),而闭区间的二分查找的是[l,r],三种写法掌握一种即可,这里提供一个Python实现的闭区间二分查找算法模版:

lst = [1, 3, 5, 5, 5, 6, 8, 9]
target = 5

l, r = 0, len(lst) - 1
while l <= r:
    mid = (l + r) // 2
    if lst[mid] < target:
        l = mid + 1
    else:
        r = mid - 1
ans = l 
print(ans) # 2

        上述算法的ans是从左到右第一个大于等于target的数的位置,也就是说有以下三种情况:

        1. 如果target在lst中且无重复的target存在,ans即为target的位置。

        2. 如果target在lst中且有重复的target存在,ans为第一个target出现的位置。

        3. 如果target不在lst中,ans为从左到右第一个大于target的数的位置,此时如果target大于lst中的所有数,ans为lst的长度(即len(lst)),而如果target小于lst中的所有数,ans即为0。

        如果要查找从右到左第一个小于等于target的数的位置,则可以使用以下的闭区间二分查找算法模版:

lst = [1, 3, 5, 5, 5, 6, 8, 9]
target = 5

l, r = 0, len(lst) - 1
while l <= r:
    mid = (l + r) // 2
    if lst[mid] <= target:
        l = mid + 1
    else:
        r = mid - 1
ans = r 
print(ans) # 4

        上述算法也有如下三种情况:

        1. 如果target在lst中且无重复的target存在,ans即为target的位置,此时与第一个算法模版结果相同。

        2. 如果target在lst中且有重复的target存在,ans为最后一个target出现的位置。

        3. 如果target不在lst中,ans为从右到左第一个小于target的数的位置,此时如果target大于lst中的所有数,ans为lst的长度减一(即len(lst) - 1),而如果target小于lst中的所有数,ans即为-1。


http://www.kler.cn/a/532357.html

相关文章:

  • 【论文复现】粘菌算法在最优经济排放调度中的发展与应用
  • 生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)
  • 【数据结构】(4) 线性表 List
  • ESLint
  • [Proteus仿真]基于51单片机的智能温控系统
  • 自动化构建-make/Makefile 【Linux基础开发工具】
  • e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置
  • 机器学习中的关键概念:通过SKlearn的MNIST实验深入理解
  • Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】
  • 神经网络常见激活函数-sigmoid函数
  • deepseek接入pycharm 进行AI编程
  • 高精度乘法(高×高)
  • 438.找到字符串中所有字母异位词
  • 数据库课程设计基于Java+MySQL+JDBC+JavaSwing的停车场管理系统源代码+数据库,进出车辆登记,车位管理
  • OSCP - Other Machines - CuteNews
  • oracle: 数据操纵语言DML/批量更新
  • C++11详解(一) -- 列表初始化,右值引用和移动语义
  • leetcode 1124. 表现良好的最长时间段
  • 开发板目录 /usr/lib/fonts/ 中的字体文件 msyh.ttc 的介绍【微软雅黑(Microsoft YaHei)】
  • Linux基础 ——tmux vim 以及基本的shell语法
  • MySQL知识点总结(十八)
  • starrocks最佳实践、行业实践
  • 014-STM32单片机实现矩阵薄膜键盘设计
  • day38|leetcode 322零钱兑换,279.完全平方数,139.单词拆分
  • 5.5.3 UML概述(一)事物
  • 深度学习篇---二维码预训练模型