热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【二分法】超清晰思路总结+模板套路化二分法,看不懂你打我。

文章目录前言[x,y]左闭右闭写法:[x,y)左闭右开写法:练手题目总结前言之前写二分法的时候没有章法,乱拳打死老师傅的感觉࿰


文章目录

    • 前言
    • [x,y] 左闭右闭写法:
    • [x,y) 左闭右开写法:
    • 练手题目
    • 总结


前言

之前写二分法的时候没有章法,乱拳打死老师傅的感觉,我估计大家也是经常在下面几种情况出错:
1.当定义了leftright之后&#xff0c;进入while循环&#xff0c;到底是while(left还是while(left<&#61;right)
2.当判断了我们要找的目标值和当前中间值mid之间的关系之后&#xff0c;更新边界的时候&#xff0c;是left&#61;mid还是left&#61;mid&#43;1

然后跟卡子哥系统的学了学&#xff0c;总结一下&#xff0c;这里需要的区分是先看定义的区间是[x,y]还是[x,y)


[x,y] 左闭右闭写法&#xff1a;


  • 1.先定义left和right
    left &#61; 0
    right &#61; 目标数组长度-1

  • 2.进入while循环&#xff0c;确定while里面是<还是<&#61;
    所有位于该区间内的元素都应该进行一遍查找&#xff0c;所以应为<&#61;
    此时代码&#xff1a;
    while(left<&#61;right)
    mid &#61; (left&#43;right)/2

  • 3.然后判断目标值和mid的大小关系&#xff0c;更新左右区间。
    if (目标值
    right &#61; mid -1
    这里是mid-1而不是mid,因为此处写的是左闭右闭区间&#xff0c;可以想象&#xff0c;在检查的时候左右边界都包含其中&#xff0c;也就是mid无论在那个位置&#xff0c;都是已经检查过的值了。

  • 4.最后就是其他两种的情况&#xff1a;
    if (目标值>mid) # 更新右边区间的左边界
    left &#61; mid &#43;1
    else return mid
    此处同理是mid&#43;1 而不是mid


[x,y) 左闭右开写法&#xff1a;


  • 1.先定义left和right
    这里的区间定义是包含x&#xff0c;不包含y&#xff0c;所以在定义right的时候注意不要再减1了。
    left &#61; 0
    right &#61; 目标数组长度

  • 2.然后就是while循环里的符号&#xff0c;
    之前在左闭右闭的时候&#xff0c;使用<&#61;因为尽可能检查多的元素且<&#61;在左闭右闭区间内合法&#xff0c;但在左闭右开区间内不合法&#xff0c;所以使用<
    while(left
    mid &#61; (left&#43;right)/2

  • 3.然后判断目标值和mid的大小关系&#xff0c;更新左右区间。
    if (目标值
    right &#61; mid
    elif (目标值>mid) # 更新右区间的左边界
    left &#61; mid &#43;1
    else return mid
    这里是mid而不是mid-1,因为此处写的是左闭右开区间&#xff0c;可以想象&#xff0c;之前写左闭右闭的时候&#xff0c;两个边界都包含其中&#xff0c;此时左边界包含其中&#xff0c;有边界不包含其中&#xff0c;所以在更新有边界的时候是mid而不是mid-1&#xff0c;同理&#xff0c;在更新左边界的时候&#xff0c;是left &#61; mid &#43;1


练手题目

leetcde 704 二分查找


总结

其实还有一个疑问就是这两种区间怎么选择的问题&#xff0c;我还没搞清楚明确的思路&#xff0c;但是放到题里直接用第一个左闭右闭区间就行&#xff0c;然后就是还有左开右闭区间&#xff0c;不过基本不怎么用&#xff0c;道理其实也和上面一样就不多说了&#xff0c;后面去刷题的时候有什么发现再补充吧。


推荐阅读
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Java数组的定义、初始化和多维数组的用法。通过动态初始化和静态初始化两种方式来初始化数组,并讨论了数组的内存分配和下标的特点。同时详细介绍了Java二维数组的概念和使用方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
ChiuChiuLIN
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有