二分查找算法模板

【二分条件】

条件: 单调、有序
时间复杂度: O(logn)

【伪代码模板】

l = -1, r = n //注意l和r一开始要在区间外 也就是二分区间为[0, n-1]
while(l + 1 != r){m = (l + r)>>1; //m∈[0, n)if(check()){l = m;}else{r = m;}return l or r; //根据实际情况选择返回l或者r
}

【注意细节】

  • 为什么lr一开始要在区间外面?

例如:l = -1, r = n //注意lr一开始要在区间外也就是二分区间为[0, n-1]

因为考虑极端情况整个数组都是红色或者蓝色的时候,那么如果一开始就指向数组内的元素就造成了错误


  • m是否始终处于[0, N)以内?

首先考虑m的最小值:l = -1, r = 1 时(为什么r = 1,因为如果r = 0,那么在while(l + 1 != r)判断时就不会进入循环体)m = (l + r) / 2 = (-1 + 1) / 2 = 0得到m的最小值为0
其次考虑m的最大值:l = N - 2, r = N 时(同理 l = N - 1 时不会进入循环体)m = (l + r) / 2 = (N - 2 + N) / 2 = N - 1得到m的最大值为N - 1
所以m∈[0, N)


  • 更新指针的时候不能写成 l = m + 1r = m - 1

有两种情况会导致出错:
①在m刚好指向蓝色边界的时候如果令l = m + 1

②在m刚好指向红色边界的时候如果令r = m - 1

所以更新左右指针的时候要写成:l = m 和 r = m


  • 程序是否会陷入死循环?
    所有情况都会回归到第一种情况 l + 1 == r


【总结】

算法一般流程:

【C/C++】二分查找算法模板总结(适用于大多数情况)相关推荐

  1. 二分查找算法java

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...

  2. 二分算法php,使用PHP实现二分查找算法代码分享

    第一种方法: [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. [优缺点]折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难.因 ...

  3. 二分查找算法详细汇总

    二分查找算法详细汇总 文章目录 二分查找算法详细汇总 二分查找算法介绍模板 算法思想 举例说明 模板实现 (1)递归方式实现 (2)非递归方式实现 二分查找问题相关难点问题1[前缀和 + 二分查找 + ...

  4. 关于《算法(第四版 谢路云译)》标准库In、Out、StdOut和StdIn的正确配置和调用经验分享(以BinarySearch二分查找算法为例)

    本人初学<算法(第四版 谢路云译)>有一段时间了,对于初学者按书敲完第一个BinarySearch二分查找算法发现运行错误,我相信大家跟我一样内心是崩溃的.还好经过翻看多个相关论坛以及自己 ...

  5. 二分查找算法(随机, 最左, 最右)

    二分查找算法 1. 普通二分查找 2.二分查找最左(第一次出现) 二分查找最左模板题 3.二分查找最右(最后一次出现) 4.二分查找练习题 1.定义 二分查找算法是一种效率较高的查找算法,每次查找能把 ...

  6. 二分查找算法(非递归)

    1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...

  7. C语言二分查找算法[基础算法]

    该算法一般适用于查找数组元素 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少; 其缺点是要求待查表为有序表,且插入删除困难. 适用于不经常变动而查找频繁的有序列表. ...

  8. 二分查找算法的万能公式(LeetCode35、704、1095)

    二分查找常常用于有序数组的查找操作.当然如果是一个问题,数组的顺序满足特定条件(不仅仅是升序或者降序,也可以是先升后降或先降后升),就可以通过逐步排查,缩小问题的规模的方式找到,这种算法也是二分查找算 ...

  9. 【算法】详解二分查找算法(思路很简单,细节是魔鬼)

    我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...

最新文章

  1. C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法...
  2. UIColor的封装
  3. 触发器无法启动分布式事务。
  4. 框架下cookie的使用_为什么自动化运维系统越来越多使用都RESTful API?
  5. 我的世界服务器盖亚3缴械修改,[管理]BossColing — 植魔盖亚 | 凋零末影龙召唤冷却时间及血量设置[1.7.10-1.12.2]...
  6. python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量
  7. 移动端 GPU 推理性能提升 2 倍!TensorFlow 推出新 OpenCL 后端
  8. java lang jar_在运行时,Java jar返回java.lang.NoClassDefFoundError
  9. 微软WIN10应用商店无法下载应用
  10. Linux查找启动的隐藏服务,Linux服务器入侵检测排查方法
  11. html5 canvas图片反色
  12. Linux EXT4文件系统简介
  13. springboot基于webrtc和janus的视频会议流程图
  14. CSS:CSS的外联样式
  15. 项目管理工具dhtmlxGantt甘特图入门教程(三):如何配置Gantt
  16. error launching app electron踩坑
  17. CREO二维CAD图纸导出1:1比例导出,单位为mm
  18. 论文解读(一)V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
  19. openGauss:(5)openGauss简介
  20. tar压缩排除某个文件夹

热门文章

  1. 赚钱门路分享:做公众号机器人赚了小桶金
  2. IAR报错未定义的外部声明Error[e46]: Undefined external “XXXX“ referred in main
  3. 使用Python快速启动文件服务器
  4. 随笔-2019.6.7回忆高考有感
  5. ATA iSpec 2300:第一章 简介
  6. (六)Linux操作系统之Linux软件包管理
  7. Springboot基于Android的洗衣店预约APP 毕业设计-附源码260839
  8. “共享”日本旅游车票 销售电商已消失
  9. 学习能力篇:为什么你一定要知道学贵有法和学无定法?
  10. php将数组变成字符串implode和explode