一、前言:什么是二分查找

首先四个字,一个"二分",一个"查找"。道出了用的什么步骤和什么目的了。通过分两半的步骤去查找我们需要的东西。

所以大家如果以查询某个数或这个字符为目标,可以用这种方法。而且这个方法可是有限制的。只能是有序的数组哦。无序的也可以(但是要先把无序的搞成有序的)。

二、举例查找相同身高(道出二分法原理)

身高查找

接下来就举一个栗子:

假设你想进入这个队伍中,找出与你相等身高的人。你只有走到队伍中,才能和相邻位置的人比较身高:

那么你会怎么选呢?

因为你的身高是不知道的。所以对于这个队伍来说,你身高是一个随机数。你是从头开始比较,还是从尾部开始比较呢?

这都不对。实际上从中间比较是最快的。这种数学难题就交给大神了: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

快速突破面试算法之二分查找篇相关推荐

  1. list 查找_趣味图解算法之二分查找

    大多数程序员在看到"算法"两字的时候,是不是头大如斗.但如果想去大公司发展,在面试时又绕不过算法这座大山.市面上好多讲解算法的书籍(如算法导论)基本上都太学术.太复杂,对初学者很不 ...

  2. 经典算法之二分查找法(俗称基本二分搜索法)

    经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...

  3. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  4. 数据结构与算法:二分查找

    二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...

  5. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  6. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  7. 查找算法:二分查找、顺序查找

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  8. 算法总结-二分查找算法

    二分查找也称折半查找(Binary Search),是一种效率较高的查找方法.该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.如果一个序列是无序的或者是链表,那么该序列就不能使用二 ...

  9. 算法简介——二分查找,时间复杂度,空间复杂度

    文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...

  10. leetcode算法之二分查找

    LeetCode算法之二分查找 前言 对于算法一直抱有恐惧感,觉得没有算法我也写了这么多代码,但周遭的环境让我感觉目前身为一名浅薄知识的敲代码的人,是需要去不断的汲取一些知识,所以就像大学学习英语单词 ...

最新文章

  1. Python之旅.第四章.模块与包
  2. 第十六届全国大学生智能汽车竞赛 英飞凌芯片申请情况
  3. 记录自己的学习和经验
  4. 60秒计时器的仿真电路_物联网应用基于Arm微控制器的低功耗定时关机计时器
  5. boost::test模块针对模式文件测试单元测试框架报告功能
  6. 在linux中,我为什么不能安装VMware Tools?
  7. CentOS7 Cloudera Manager6 完全离线安装 CDH6 集群
  8. 华为户外模式怎么设置_华为FreeLace Pro降噪器效果怎么样?降噪开启和设置教程!...
  9. 操作系统重装或还原后Domino 8 无法启动解决方法
  10. 多进程和多线程的区别_关于多进程和多线程的那些事儿
  11. 《一个程序员的奋斗史》帮我选封面哇! —— 猜封面页数赢赠书活动~
  12. 学习笔记(16):GIS遥感科技论文写作技巧与方法初探-地理探测器
  13. 不加好友实现QQ在线代码状态临时会话
  14. CSS颜色渐变的按钮样式
  15. 2023年前实现大型工业企业5G应用渗透率超35%!模组企业如何保驾护航?
  16. 桌面图标有蓝底处理刚才
  17. 关于360评估的全面介绍
  18. Win10如何禁止自动更新?Win10禁止更新又恢复怎么办?
  19. 桌面窗口管理器 GPU 3D 占用100% 的解决方法
  20. 爬虫Scrapy框架学习(五)-东莞阳光热线问政平台爬取案例

热门文章

  1. 浅谈 Mybatis 中的 ${ } 和 #{ }的区别
  2. oracle 表列统计信息,Oracle中收集表与列统计信息
  3. microsoft excel 正在等待其他某个应用程序_(Mac常见问题)都有哪些应用程序可以在M1 Mac上运行?...
  4. m 940 /vbulletin/_爱在当下 MM 伴你纵享别样万圣之夜
  5. java计算日期之间的天数_使用Java计算两个日期之间的天数
  6. python3字典详解_python3 字典的常用 方法
  7. linux下 fork(),vfork(),clone()的用法及区别
  8. 小猴子下落nyoj63(一道可以直接写的好题)
  9. 马拦过河卒问题 (递推解法)
  10. 咖啡html代码,咖啡.html