【C/C++】二分查找算法模板总结(适用于大多数情况)
二分查找算法模板
【二分条件】
条件: 单调、有序
时间复杂度: 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
}
【注意细节】
- 为什么
l
和r
一开始要在区间外面?
例如:
l = -1, r = n
//注意l
和r
一开始要在区间外也就是二分区间为[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 + 1
或r = m - 1
有两种情况会导致出错:
①在m刚好指向蓝色边界的时候如果令l = m + 1
:
②在m刚好指向红色边界的时候如果令r = m - 1
:
所以更新左右指针的时候要写成:l = m 和 r = m
- 程序是否会陷入死循环?
所有情况都会回归到第一种情况l + 1 == r
【总结】
算法一般流程:
【C/C++】二分查找算法模板总结(适用于大多数情况)相关推荐
- 二分查找算法java
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...
- 二分算法php,使用PHP实现二分查找算法代码分享
第一种方法: [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. [优缺点]折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难.因 ...
- 二分查找算法详细汇总
二分查找算法详细汇总 文章目录 二分查找算法详细汇总 二分查找算法介绍模板 算法思想 举例说明 模板实现 (1)递归方式实现 (2)非递归方式实现 二分查找问题相关难点问题1[前缀和 + 二分查找 + ...
- 关于《算法(第四版 谢路云译)》标准库In、Out、StdOut和StdIn的正确配置和调用经验分享(以BinarySearch二分查找算法为例)
本人初学<算法(第四版 谢路云译)>有一段时间了,对于初学者按书敲完第一个BinarySearch二分查找算法发现运行错误,我相信大家跟我一样内心是崩溃的.还好经过翻看多个相关论坛以及自己 ...
- 二分查找算法(随机, 最左, 最右)
二分查找算法 1. 普通二分查找 2.二分查找最左(第一次出现) 二分查找最左模板题 3.二分查找最右(最后一次出现) 4.二分查找练习题 1.定义 二分查找算法是一种效率较高的查找算法,每次查找能把 ...
- 二分查找算法(非递归)
1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...
- C语言二分查找算法[基础算法]
该算法一般适用于查找数组元素 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少; 其缺点是要求待查表为有序表,且插入删除困难. 适用于不经常变动而查找频繁的有序列表. ...
- 二分查找算法的万能公式(LeetCode35、704、1095)
二分查找常常用于有序数组的查找操作.当然如果是一个问题,数组的顺序满足特定条件(不仅仅是升序或者降序,也可以是先升后降或先降后升),就可以通过逐步排查,缩小问题的规模的方式找到,这种算法也是二分查找算 ...
- 【算法】详解二分查找算法(思路很简单,细节是魔鬼)
我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...
最新文章
- linux下多线程的调试
- adf4351_在ADF实体PK属性中使用MySQL自动增量PK列
- Java中ArrayList最大容量为什么是Integer.MAX_VALUE-8?
- notepad 没有plugin manager_自学英语的几个网站(免费网站)?性价比高的机构有没有?...
- java中script类_在Scripting java(javax.script)中导入一个类
- 概要设计说明书案例_逆向前行,趁势而为外贸学院线上教学优秀案例展(七)...
- 绝地求生测试服画面优化软件,绝地求生正式服设置详解 教你调校最完美的画质...
- 音乐播放小程序demo
- web 网页设计规范介绍
- 计算机方面的英语学术期刊,近几年计算机专业英文参考文献 计算机专业英文核心期刊参考文献有哪些...
- 前端开发 html第三课 列表 超链接 相对路径 图片
- uniapp 安卓模拟器mumu 端口配置
- vue项目使用预渲染 进行seo优化
- CAD中怎么修改图块名称?CAD图块改名教程
- Python量化交易学习笔记(21)——A股股票列表更新
- 采样点数与采样频率的区别
- Day213.讲师详细页、课程列表页面、课程详细页、阿里云视频播放测试、阿里云云视频播放器 -谷粒学院
- 毕业设计-基于微信小程序的疫情防控系统
- python金融分析试题及答案_Python在金融中的应用-曾凡-中国大学mooc-试题题目及答案...
- Sensor简介(一):摄像头模组CCM的结构和原理简述