热门标签 | 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;后面去刷题的时候有什么发现再补充吧。


推荐阅读
  • 本文主要对比了Proxy和Object.defineProperty两种对象属性操作方式的优劣,并介绍了它们各自的应用场景。Proxy具有直接监听对象和数组变化、多种拦截方法以及新标准的性能优势等特点,而Object.defineProperty则兼容性好,支持IE9,并且无法用polyfill磨平浏览器兼容性问题。根据具体需求和浏览器兼容性考虑,选择合适的方式进行对象属性操作。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Java数组的定义、初始化和多维数组的用法。通过动态初始化和静态初始化两种方式来初始化数组,并讨论了数组的内存分配和下标的特点。同时详细介绍了Java二维数组的概念和使用方法。 ... [详细]
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社区 版权所有