快速突破面试算法之二分查找篇
一、前言:什么是二分查找
首先四个字,一个"二分",一个"查找"。道出了用的什么步骤和什么目的了。通过分两半的步骤去查找我们需要的东西。
所以大家如果以查询某个数或这个字符为目标,可以用这种方法。而且这个方法可是有限制的。只能是有序的数组哦。无序的也可以(但是要先把无序的搞成有序的)。
二、举例查找相同身高(道出二分法原理)
身高查找
接下来就举一个栗子:
假设你想进入这个队伍中,找出与你相等身高的人。你只有走到队伍中,才能和相邻位置的人比较身高:
那么你会怎么选呢?
因为你的身高是不知道的。所以对于这个队伍来说,你身高是一个随机数。你是从头开始比较,还是从尾部开始比较呢?
这都不对。实际上从中间比较是最快的。这种数学难题就交给大神了:https://blog.csdn.net/acdream_/article/details/83277936
从文章我们可以知道从中间找是最快的!
那么具体操作怎么来呢?看我一一道来
根据上面的例子,比如你现在这么高(以实际图为准),要怎么用二分查找呢?
这是我们要插入的人(名为小万)
分为两种情况,队列中是否存在指定高度的成员: 1.存在 2.不存在
队列中存在这个身高:
1.首先先要找到中间位置,直接进行curr=(left+right)/2,这里尽量用curr=(right-left)/2+left 因为left+right可能导致数溢出。比如数是int,它最多只能存2^32这么大的数!大于这个就溢出,数就失真了。
队列中所对应的位置是0~5(数组是从0开始的)计算出我们应该和第2号位置比较,因为JAVA中Int计算会直接略去小数部分,但不影响我们二分方法结果。
2.当小万进去后,发现2号位置的人比我还矮,心里就想:哈哈哈,看来我身高还不算矮,应该找得到女朋友~。 然后小万继续找自己该去哪个位置,然后此时我们就可以忽略curr~right这些人了,因为这些人都比2号位的人矮。下一步就去left~curr区间(不包含curr)寻找了。现在进行的操作就是进行第一步操作,找left~curr区间的中间值了,为了之后方便递归,把right移动到curr-1,这样right就会移动到如下位置。
3.继续找中间位置比较身高,curr=(left+right)/2,发现这两个身高相等,返回true、或当前的坐标,根据题目的需要啦。
以上就是队列中存在着小万身高的情况,这就是一半一半的查找。因为比较中间后,总有一半会被舍去,节约了大半时间。
队列中不存在这个身高:
1.首先先要找到中间位置,直接进行curr=(left+right)/2,这里尽量用curr=(right-left)/2+left 因为left+right可能导致数溢出。比如数是int,它最多只能存2^32这么大的数!大于这个就溢出,数就失真了。
队列中所对应的位置是0~5(数组是从0开始的)计算出我们应该和第2号位置比较,因为JAVA中Int计算会直接略去小数部分,但不影响我们二分方法结果。
2.当小万进去后,发现2号位置的人比我还矮,心里就想:哈哈哈,看来我身高还不算矮,应该找得到女朋友~。 然后小万继续找自己该去哪个位置,然后此时我们就可以忽略curr~right这些人了,因为这些人都比2号位的人矮。下一步就去left~curr区间(不包含curr)寻找了。现在进行的操作就是进行第一步操作,找left~curr区间的中间值了,为了之后方便递归,把right移动到curr-1,这样right就会移动到如下位置。
3.继续找中间位置比较身高,curr=(left+right)/2
4.进去后发现比0号位置矮,所以移动Left到curr+1处,因为我们只能去curr~right(不含curr)中寻找了。
5.在这里进行一次比较,发现还是比这个小。所以要选择curr~right这边。left=curr+1.
6.left已经超过right说明已经遍历完了可能的结果了,二分的循环查找结果。如果这点不是很理解,可以这样理解,之前已经比较过2号位,所以就不需要再比较了,就返回值即可
说明这个身高在这个队列中的所有身高是没有相等的。
三、一切理论都源于实践,多刷题领悟其中精髓才能真正掌握!
四、面试高频题目录
1.x的平方根(力扣69) 博主的笔记思路及代码讲解:https://blog.csdn.net/qq_40262372/article/details/112604230
2.寻找比目标字母大的最小字母(力扣744)博主的笔记思路及代码讲解:https://blog.csdn.net/qq_40262372/article/details/112604256
3.有序数组中的单一元素(力扣540) 博主的笔记思路及代码讲解: https://blog.csdn.net/qq_40262372/article/details/112604324
4.第一个错误版本(力扣278) 博主的笔记思路及代码讲解: https://blog.csdn.net/qq_40262372/article/details/112604338
5. 寻找旋转排序数组中的最小值 (力扣153)
博主的笔记思路及代码讲解: https://blog.csdn.net/qq_40262372/article/details/112604356
6. 在排序数组中查找元素的第一个和最后一个位置(力扣34)
博主的笔记思路及代码讲解: https://blog.csdn.net/qq_40262372/article/details/112604369
五、各种类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112556249
六、如有疑问可加QQ群讨论:725936761 博主免费答疑
欢迎大家一起讨论进步。后续遇到相似的题会继续更新!
群里已有字节、滴滴大佬,可帮忙内推!也欢迎其他大厂的工作人士进群!帮忙内推~
为了鼓励大家坚持,当天打卡人数超过一半,群主发一个红包(群主是学生),激励大家坚持下去!希望以后找工作的时候大家能互捞一下~~~
B站视频讲解如何三个月学习JAVA拿到实习Offer:
https://www.bilibili.com/video/BV1dV411t71K
快速突破面试算法之二分查找篇相关推荐
- list 查找_趣味图解算法之二分查找
大多数程序员在看到"算法"两字的时候,是不是头大如斗.但如果想去大公司发展,在面试时又绕不过算法这座大山.市面上好多讲解算法的书籍(如算法导论)基本上都太学术.太复杂,对初学者很不 ...
- 经典算法之二分查找法(俗称基本二分搜索法)
经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- 数据结构与算法:二分查找
二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- 查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- 算法总结-二分查找算法
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法.该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.如果一个序列是无序的或者是链表,那么该序列就不能使用二 ...
- 算法简介——二分查找,时间复杂度,空间复杂度
文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...
- leetcode算法之二分查找
LeetCode算法之二分查找 前言 对于算法一直抱有恐惧感,觉得没有算法我也写了这么多代码,但周遭的环境让我感觉目前身为一名浅薄知识的敲代码的人,是需要去不断的汲取一些知识,所以就像大学学习英语单词 ...
最新文章
- Python之旅.第四章.模块与包
- 第十六届全国大学生智能汽车竞赛 英飞凌芯片申请情况
- 记录自己的学习和经验
- 60秒计时器的仿真电路_物联网应用基于Arm微控制器的低功耗定时关机计时器
- boost::test模块针对模式文件测试单元测试框架报告功能
- 在linux中,我为什么不能安装VMware Tools?
- CentOS7 Cloudera Manager6 完全离线安装 CDH6 集群
- 华为户外模式怎么设置_华为FreeLace Pro降噪器效果怎么样?降噪开启和设置教程!...
- 操作系统重装或还原后Domino 8 无法启动解决方法
- 多进程和多线程的区别_关于多进程和多线程的那些事儿
- 《一个程序员的奋斗史》帮我选封面哇! —— 猜封面页数赢赠书活动~
- 学习笔记(16):GIS遥感科技论文写作技巧与方法初探-地理探测器
- 不加好友实现QQ在线代码状态临时会话
- CSS颜色渐变的按钮样式
- 2023年前实现大型工业企业5G应用渗透率超35%!模组企业如何保驾护航?
- 桌面图标有蓝底处理刚才
- 关于360评估的全面介绍
- Win10如何禁止自动更新?Win10禁止更新又恢复怎么办?
- 桌面窗口管理器 GPU 3D 占用100% 的解决方法
- 爬虫Scrapy框架学习(五)-东莞阳光热线问政平台爬取案例
热门文章
- 浅谈 Mybatis 中的 ${ } 和 #{ }的区别
- oracle 表列统计信息,Oracle中收集表与列统计信息
- microsoft excel 正在等待其他某个应用程序_(Mac常见问题)都有哪些应用程序可以在M1 Mac上运行?...
- m 940 /vbulletin/_爱在当下 MM 伴你纵享别样万圣之夜
- java计算日期之间的天数_使用Java计算两个日期之间的天数
- python3字典详解_python3 字典的常用 方法
- linux下 fork(),vfork(),clone()的用法及区别
- 小猴子下落nyoj63(一道可以直接写的好题)
- 马拦过河卒问题 (递推解法)
- 咖啡html代码,咖啡.html