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

embedded/2025/2/5 8:52:59/

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

python">lst = [1, 3, 5, 5, 5, 6, 8, 9]
target = 5l, r = 0, len(lst) - 1
while l <= r:mid = (l + r) // 2if lst[mid] < target:l = mid + 1else: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的数的位置,则可以使用以下的闭区间二分查找算法模版:

python">lst = [1, 3, 5, 5, 5, 6, 8, 9]
target = 5l, r = 0, len(lst) - 1
while l <= r:mid = (l + r) // 2if lst[mid] <= target:l = mid + 1else: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.ppmy.cn/embedded/159706.html

相关文章

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…

Ansys Scade One 学生版

Ansys Scade One 学生版是一个基于模型的解决方案的免费版本&#xff0c;用于开发安全的嵌入式应用软件。 Ansys Scade One 软件是 Ansys SCADE 工具的继任者&#xff0c;并扩展了许多新功能。该集成开发环境&#xff08;IDE&#xff09;提供了设计、模拟和调试模型以及生成嵌…

Java的Integer缓存池

Java的Integer缓冲池&#xff1f; Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此缓存这些对象可以减少内存分配和垃圾回收的负担&#xff0c;提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…

wxWidgets使用wxdataviewctrl显示表格数据

这里类似于Qt的ModelView中的qtableview,不过仅仅只是类似。 wxDataViewCtrl 控件,用于以类似树的形式或以表格形式或两者兼而有之的方式显示数据。 如果只需要使用更类似于旧 wxTreeCtrl 类的 API 显示简单的树结构,则可以使用专用的 wxDataViewTreeCtrl。同样,如果您只…

独立开发经验谈:如何借助 AI 辅助产品 UI 设计

我在业余时间开发了一款自己的独立产品&#xff1a;升讯威在线客服与营销系统。陆陆续续开发了几年&#xff0c;从一开始的偶有用户尝试&#xff0c;到如今线上环境和私有化部署均有了越来越多的稳定用户&#xff0c;在这个过程中&#xff0c;我也积累了不少如何开发运营一款独…

超详细UE4(虚幻4)第一人称射击(FPS)游戏制作教程

超详细UE4(虚幻4)第一人称射击(FPS)游戏制作教程 引言 在游戏开发领域,第一人称射击(FPS)游戏一直是最受欢迎的类型之一。从经典的《反恐精英》(CS)到现代的《使命召唤》(Call of Duty),FPS游戏凭借其紧张刺激的游戏体验和高度沉浸感,吸引了无数玩家。如果你是一…

Unity-编译构建Android的问题记录

文章目录 报错&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout报错信息解读&#xff1a;原因分析最终处理方法 报错&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 报错信息解读&#xff1…

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末&#xff0c;阿强正瘫在沙发上&#xff0c;百无聊赖地换着电视频道。突然&#xff0c;一则新闻吸引了他的注意&#xff1a;某博物馆里一幅珍贵的古画离奇失踪&#xff0c;警方怀疑是被一伙狡猾的盗贼偷走了&#xff0c;现场只留下一些模糊不清的监控画面&a…