二分查找算法模板

【二分条件】

条件: 单调、有序
时间复杂度: 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. linux下多线程的调试
  2. adf4351_在ADF实体PK属性中使用MySQL自动增量PK列
  3. Java中ArrayList最大容量为什么是Integer.MAX_VALUE-8?
  4. notepad 没有plugin manager_自学英语的几个网站(免费网站)?性价比高的机构有没有?...
  5. java中script类_在Scripting java(javax.script)中导入一个类
  6. 概要设计说明书案例_逆向前行,趁势而为外贸学院线上教学优秀案例展(七)...
  7. 绝地求生测试服画面优化软件,绝地求生正式服设置详解 教你调校最完美的画质...
  8. 音乐播放小程序demo
  9. web 网页设计规范介绍
  10. 计算机方面的英语学术期刊,近几年计算机专业英文参考文献 计算机专业英文核心期刊参考文献有哪些...
  11. 前端开发 html第三课 列表 超链接 相对路径 图片
  12. uniapp 安卓模拟器mumu 端口配置
  13. vue项目使用预渲染 进行seo优化
  14. CAD中怎么修改图块名称?CAD图块改名教程
  15. Python量化交易学习笔记(21)——A股股票列表更新
  16. 采样点数与采样频率的区别
  17. Day213.讲师详细页、课程列表页面、课程详细页、阿里云视频播放测试、阿里云云视频播放器 -谷粒学院
  18. 毕业设计-基于微信小程序的疫情防控系统
  19. python金融分析试题及答案_Python在金融中的应用-曾凡-中国大学mooc-试题题目及答案...
  20. Sensor简介(一):摄像头模组CCM的结构和原理简述

热门文章

  1. 什么是UGC社区?#社区产品笔记
  2. ae教程 (七)动效插件 (一)古街飘雪
  3. web前端设计与开发期末作品/期末大作业(辅导6页)
  4. 极光开发者周刊【No.0528】
  5. Linux常用命令——grub命令
  6. resources文件夹里存放的是什么
  7. 小黑前天遇到的C0000218错误
  8. mailbox数据发送和接收的过程
  9. 恋与抽卡模拟器网页_橙光恋与制作人
  10. 机票预订系统需求分析报告