加星标!天天中午 12:15 一起学算法之十分好用的二分查找法模板 chanong 2025-05-10 06:58:52 编辑说 高清动画+图片+步骤分析,手把手教你如何正确高效的刷这些算法题!!! 每天中午12:15添加“星”并一起学习算法 作者|李维 来源| 组织|在五分钟内学习算法 全文包含12,000多个单词和30张高清图片。估计的阅读时间为40分钟。强烈建议先收集它,然后仔细阅读。 文本 以下动画将“强延迟”问题704:二进制搜索作为一个示例,显示了使用此模板编写二进制搜索方法的一般过程。 --- new.gif 以下“演示”显示了本文想解释的主要内容。您只能查看此部分中的内容。如果您想更仔细地阅读它,则可以在“演示”之后查看原始文本。 介绍“非常好的二进制搜索方法模板” --- 1.png --- 2.png --- 3.png --- 4.png --- 5.png --- 6.png --- 7.png --- 8.png --- 9.png --- 10.png --- 11.png --- 12.png --- 13.png (上面的“演示”是以下文本的摘要。) 1。简介 本文介绍了一个模板,我可以使用“二进制搜索方法”在过去六个月中编写问题,包括此模板的优势,使用技能,预防措施,调试方法等。 尽管这是一个模板,但我不打算从一开始就发布代码,因为根本不需要记住此模板。只要您能理解文本中描述的知识点和预防措施并应用它们(尝试问题)。我相信您会像我一样喜欢这个模板,并且认为使用它是很自然的。 该模板应帮助您解决“二进制查找”标签(简单,中等难度)的常见问题。 只要您能理解文本中描述的知识点和预防措施并应用它们(实际上,这只是一个多选择的问题),我相信您会像我一样喜欢这个模板,并认为使用它是自然的。 2。有关“二进制搜索方法”的历史故事 尽管二进制搜索方法很简单,但写得很好并不容易。我们可以看一些关于二进制搜索方法的著名人物的讨论。 IS的基本思想可以是… 翻译:“尽管二进制搜索的基本思想相对简单,但细节可能非常棘手。”从 Thm中,请原谅我的中文翻译可能非常不高。 二进制搜索方法的想法是在1946年提出的。但是,第一个没有错误的二进制搜索方法仅出现在1962年。 (由于时间和个人能力,我无法提供原始的英文文字。如果您能找到原始的英文文字,请提供来源。谢谢您。) 据说,该错误被藏在Java JDK中已有近十年的历史,然后才被发现和修复。 当乔恩(Jon)作为f in for时,他发现在少数数小时后,在稀有边缘案件中运行或错误。 翻译:在专业程序员课程中使用二进制搜索作为问题时,他发现90%的人在花费数小时学习后没有提供正确的解决方案,这主要是因为错误的实施无法正确运行(作者的注意:它可能会返回错误的结果或死亡循环),或者无法很好地评判边界条件。 3。“传统”二进制搜索方法模板的问题 (1)获取中位数索引的代码存在问题 int mid = (left + right) / 2 这条代码有问题。当左和右相对较大时,左 +右可能会超过int类型可以代表的最大值,即整数溢出。为了避免此问题,应将其写入: int mid = left + (right - left) / 2 ; 实际上,当右右 +(右 - 左) / 2很大时,左int =左 +(右) / 2是负数,左数很小非负整数是什么,右 - 左可能也可能超过int类型可以代表的最大值。但是,通常,左右表示数组索引值,而左侧是一个非负数,因此右溢出的可能性很小。 一种更好的写作方法是: int mid = (left + right) >>> 1 ; 原因稍后引入,请注意: 使用“左边界索引 +右边界索引”,然后使用“未签名右1位”是推荐写它的方法。 (2)在循环中可以执行的条件如while(左> 1;`根据循环中分支的写作状态,进行调整 要理解这一点,您必须首先知道:当数组中的元素数量是甚至中位数时,可以分为左中间和右中间。 使用int mid =左 +(右 - 左) / 2;获取左中间的索引; 使用int mid =左 +(右 - 左+1) / 2;获取合适的中位数的索引。 第二, int mid = left + (right - left) / 2 ; 等效于 int mid = (left + right) >>> 1; 和 int mid = left + (right - left + 1) / 2 ; 等效于 int mid = (left + right + 1) >>> 1 我们使用一个特定示例来验证:当左边界索引左= 3和右边界索引右= 4, mid1 = left + (right - left) // 2 = 3 + (4 - 3) // 2 = 3 + 0 = 3mid2 = left + (right - left + 1) // 2 = 3 + (4 - 3 + 1) // 2 = 3 + 1 = 4 左中间MID1是左侧索引,右中间MID2是索引右侧。 内存方法: (右 - 左)否1选择左中间,然后选择右中间。 那么,什么时候使用左中间值以及何时使用右中间?选择中位数的基础是避免循环。必须根据分支的逻辑选择中位数。还有编写分支逻辑的技术,下面将详细说明。 (3)首先编写逻辑上容易想到的分支逻辑。该分支逻辑通常是排除中位数的逻辑。 从逻辑上讲,“也许或可能不会”使我们犹豫,但是**必须“不可能”是我们非常确定的事情,而且我们通常认为的因素特别单身,因此“非常想要” **。在生活中,我们经常听到以下单词:寻找合作伙伴时,“如果您有汽车或房屋,您可以考虑,但是如果没有它,则不得做”;当寻找工作时,“如果您有更少的孩子并且离家很近,就可以考虑,但是如果您的钱较少,那就不可能去了。”这是这个想法的体现。 示例:问题69:x的平方根 实现INT SQRT(INT X)函数。 计算并返回x的平方根,其中x是一个非阴性整数。 由于返回类型是整数,因此仅保留整数的一部分,并且小数部分将被丢弃。 分析:由于问题说“返回类型是整数,因此结果是仅保留整数的一部分,而小数部分将被丢弃。”例如,5的平方根大约等于2.236,在此问题中,应返回2。因此,如果一个数字的平方小于或等于x,则该数字可能是x的平方根,但是可以肯定的是,如果一个数字的平方大于x,则该数字绝对不是x的平方根。 注意:首先写“我想要”分支。排除中位数之后,中位数通常不被另一个分支排除,并且无需考虑另一个分支的逻辑的特定含义,并且代码几乎是固定的。 (4)只有两个分支写在循环中,一个分支不包括中位数,另一个分支不排除中位数。中位数未在循环中分别判断。 由于这是一种“攀登”方法,因此无需在每轮循环开始之前分别确定当前的中位数是否为目标元素。因此,一个分支较少,并且代码执行效率更高。 以下是两个模板代码,这些模板代码在考虑“排除中位数的逻辑”之后可能会出现。 二进制搜索方法模板 可以排除“中值”的逻辑,根据情况,通常更容易考虑,但绝对不是绝对的。 分支的数量变为2,比原始的3个分支小。好处是: 无需考虑中位数是否是每个循环中的目标元素,这节省了时间。我们只需要确定该索引表示的数字是否是退出循环时的目标元素,即,当将左和右间隔压缩到数字(索引)中时,而无需在二进制逻辑中做出单独的判断。 这很重要。我希望读者能够结合特定的练习认真理解它。在每个周期开始时分别做出判断。从统计意义上讲,二分法中位数中位数的可能性不高,即使您想这样做,它也不是普遍的,也无法解决大多数问题。 以问题35为例,通过先前的分析,我们需要找到“第一个数字的索引大于或等于目标值”。对于这个问题: (1)如果中位数小于目标值,则应将其排除,左边界左至少为Mid + 1; (2)如果中位数大于或等于目标值,则不确定它是我们正在寻找的数字,因为我们正在寻找的是第一个数字等于目标值的索引。中位数的中值和左侧可能是符合问题含义的数字,因此右边界不能排除中间,因此右边界右最多是中间的,右边界此时也不会向左缩小。 下一点更为关键。 (5)根据分支逻辑选择中位数的类型,该逻辑可能是左中位数或右中位数。选择标准是避免死亡循环 创建死循环的代码 当间隔中只有2个元素时,可能会发生死循环,并且目前的中位数尤其重要。选择中位数的基础是避免死周期。我们需要确保: (以下两个规则非常令人困惑,可以暂时跳过)。 1。如果分支逻辑在选择左边界时无法排除中位数,则将中位数选为“右中间”。只有这样,间隔才会收缩,否则它将进入死循环; 2。同样,如果选择分支的正确边界时无法排除中位数,则将中位数选为“左中间”。只有这样,间隔才会收缩,否则它将进入死循环。 要了解上述规则,您可以使用特定示例。对于以上规则的第1点:如果使用分支的逻辑,则在选择左边界时不能排除中间体:例如: 伪代码: while left < right: # 不妨先写左中位数,看看你的分支会不会让你代码出现死循环,从而调整 mid = left + (right - left) // 2 # 业务逻辑代码 if (check(mid)): # 选择右边界的时候,可以排除中位数 right = mid - 1 else: # 选择左边界的时候,不能排除中位数 left = mid 您是否不了解上述段落都没关系,因为我还没有举一个例子。只有印象。同样,了解选择中位数的基础的第二点。 (6)退出循环时,您可能需要对剩余数量的“挤压”做出单独的判断。此步骤称为“后处理”。 二进制搜索方法有效的原因是它利用数组的顺序。在每个搜索过程中,可以排除数字的几乎一半,从而使搜索间隔越来越小,直到间隔变为数字为止。在本节开始时返回问题:“间隔的左右边界相等(即缩小为1个数字)时,是否会错过此数字?”,解释如下: 1。如果您的业务逻辑确保您要寻找的数字必须以左和右边界表示的间隔出现,则可以在不做出任何判断的情况下自信地返回或向右返回; 2。如果您的业务逻辑无法保证您要寻找的数字必须出现在左和右边界表示的间隔中,则在退出环路后,对NUMS [左]或NUMS [左]做出单独的判断(此时NUMS [左] == NUMS [右])才能查看是否是您正在寻找的数字。此步骤通常称为“后处理”。 示例:问题69:x的平方根 实现INT SQRT(INT X)函数。 计算并返回x的平方根,其中x是一个非阴性整数。 由于返回类型是整数,因此仅保留整数的一部分,并且小数部分将被丢弃。 分析:非负实数X的平方根必须存在于[0,x]中,因此退出(左<右)循环后,无需单独判断左还是右符合问题。 示例:问题704:二进制搜索 给定一个(上升的)整数数组数字和带有n个元素的目标值,请写一个函数以搜索数字。如果目标值存在,请返回下标,否则返回-1。 分析:由于目标编号可能不在数组中,因此当候选间隔被迫分为一个数字时,您必须确定数字是否分别是目标数。如果不是,请返回-1。 (7)服用中位数时,请避免计算中的整数溢出; int mid =(左 +右) / 2;:当左右右大的问题很大,左 +右 +右 +将溢出整数并变成负数。这是一个错误,需要更改! int mid =左 +(右 - 左) / 2;当右侧较大时,左数为负数,非常小,右 - 左也可能超过int类型可以代表的最大值。但是,通常,左右表示数组索引值,而左侧是一个非负数,因此右溢出的可能性很小。因此,这是编写它的正确方法。推荐的写作方法在下面介绍。 int mid =(左 +右)>>> 1;如果这样写,则在整数溢出发生后,左 +右右图将成为负数。目前,如果除以2,则MID为负数,但是在未签名的右移之后,您可以在没有溢出的情况下获得正确的结果。 解释“未签名的正确移动”:在Java中,未签名的右偏移操作员>>>之间的差异与正确的移位操作员>>如下: 以下解释是上面的模板。采用中位数时,首先使用“+”,然后使用“右签名”。 1。int mid =(左 +右) / 2和int mid =左 +(右) / 2两种写作方法都有整数溢出的风险,而没有绝对安全。注意:在这里,我们使用平均值除以2并将其划分: 2。编写算法问题时,通常要求您在数组中进行二进制搜索。因此,左右通常表示数组的索引。因此,左数不会是负数,并且在大多数情况下很小。因此,使用int mid =左 +(右 - 左)// 2比int mid =(左 +右)// 2相对安全,并且还可以向其他人展示我们已经注意到整数溢出,但实际上,有更好的方法; 3。建议使用int mid =(左 +右)>>> 1。这种写作方式实际上具有很大的含义: 在JDK8中,使用了int =(左 +右)>>> 1,焦点不是 +,而是在>>>上。 When we look at the , when left and high are both the of the , note that at this time, the bit of the 32-bit value is 0. After they are added, the bit is 1, which a , but then the right shift >>> (the point is that the sign bit is , and the empty bits are with 0), you can that the use of + is still after the . 对于Java中和提供的方法,我们单击以查看左右都表示索引。使用未签名的右移而不必担心整数溢出,因此请使用int mid =(左 +右)>>> 1可以。比特操作比使用除法更快,因此它似乎使用 +和1。无论如何,左右表示索引。 (8)一旦在编码中发生一个死循环,输出必要的变量值,分支逻辑是调试的重要方法。 当发生死循环时,调试方法:打印出必要的信息,例如左右边界,中值,目标值,分支逻辑等。 根据我的经验,一开始编码时,如果您不小心,您会很容易地有一个死循环,但这没关系。您可以在代码中编写一些输出语句,以便轻松理解“只有2个间隔元素,您就可以轻松地拥有一个死循环。” 6。摘要 总而言之,使用此模板的原因,技术,优势和预防措施: (1)原因: 左<右:无脑部写入,因此您不必判断退出循环时是否应左右返回,因为左右返回是正确的; (2)技能: 首先编写分支逻辑,然后编写排除中位数的逻辑分支(因为排除中位数的逻辑更容易考虑,但我之前提到过,这不是绝对的)。您无需考虑另一个分支的逻辑。只需编写第一个分支的反向代码(在下面的描述中引入),然后根据分支情况选择使用左中间或右中间的代码; 说明:让我在这里说更多。如果从代码可读性的角度来看,只要它是一个逻辑分支,您认为非常好,请在前面写并添加您的评论,以便其他人可以理解它,并且您不必考虑其对另一个分支的逻辑。有时,另一个分支的逻辑并不容易考虑,很容易进入自己。如果您练习做得太多,条件反射会发展。 我简要总结了左右分支的规则,如下所示: “相反的是真实”的含义:如果在您的逻辑中,“边界不能排除中间值”的逻辑是非常思考的,那么您将其写在第一个分支上,而另一个分支是相反的。您可以根据上述规则直接提供代码。这样做的理论基础是“排除方法”。 (3)优点: 只有2个分支,并且代码执行效率更高。无需单独判断中位数是否符合每轮循环中问题的要求。编写分支机构的目的是尽可能消除更多的候选要素,我们最终确定中位数是否满足问题的要求。这是第5点; 注意:在每个周期开始时,我们将确定中位数是否分别满足要求。该操作不是很普遍,因为从统计意义上讲,中位数直接是您想要找到的数字的可能性不高。有时我们必须看左和右。让我们最终将其根据情况分开做出判断。 (4)注1: 选择左中值或右中间的标准基于分支的逻辑。标准是每个循环应收缩间隔。当候选间隔中只剩下2个元素时,为了避免发生死环的发生,请选择正确的中值类型。如果您真的很头晕,请使用带有2个元素的测试用例来理解原因。另外,当代码具有死循环时,建议您打印出左边界,右边界,选择的中位数和分支逻辑。死亡循环的原因将一目了然。 (5)注2: 如果您可以确定要查找的数字是在候选间隔中,那么当您退出循环时,间隔最终将其收缩为1个数字,然后直接返回数字;如果您要寻找的数字可能不在候选间隔中,并且在间隔最终缩小为1个数字之后,您还必须确定该数字是否符合问题的含义。 最后,我们将提供两个模板。当您阅读它们时,您不必或记住它们。 二进制搜索模板1.png 二进制搜索模板2.png 注意:默认情况下,我通常写作中位数为左中间,然后根据分支的情况,查看是否有必要将其调整到右中间,也就是说,是否应将1添加到(右 - 左)支架中。 尽管有两个模板,但区别在于选择了中位数。中位数是根据分支逻辑选择的。原则是间隔应该收缩,不会有死循环。当退出循环时,根据情况,可能有必要对剩余数字做出单独的判断。 我想我必须成功地困惑您。如果您认为这是一个漫长的部分,请认为我“说三遍重要的话”。我将重复关键点。 当然,了解此模板的最佳方法是应用它。 在这里,我们建议您不妨使用“二进制搜索方法”来解决一些问题。使用我提到的模板。在发现问题的过程中,您将体验此模板的有用性。我相信您会像我一样爱上这个模板。 7。申请改进 以下是一些锻炼问题,可以使用此“神奇”二进制搜索方法模板轻松编写,并获得良好的分数。快点! 问题704 问题69 问题153 问题154 第287章 问题1095 问题658 问题4 有很多建议 1.【程序员】 2.【】 3.【算法】 4。[数据结构] 快速报名 学生姓名 意向学校 意向专业 联系方式 请输入正确的电话号码 或许你还想看: 三峡七百里的壮丽风光:两岸连山、夏水襄陵及四季之景 加星标!天天中午 12:15 一起学算法之十分好用的二分查找法模板 可敬的寿镜吾老先生:方正博学,重教育而非体罚学生 点赞 免责声明 本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除! 大家都在看 上一篇 可敬的寿镜吾老先生:方正博学,重教育而非体罚学生 下一篇 三峡七百里的壮丽风光:两岸连山、夏水襄陵及四季之景 大家都在看 三峡七百里的壮丽风光:两岸连山、夏水襄陵及四季之景 郦道元的三峡原文及翻译:原文 自(1)三峡七百里中,两岸连山,略无阙处(2);重岩叠嶂(3),隐天蔽日,自非(4)亭午夜分(5),不见曦(6)月。 至于夏水襄陵(7) 艺考资讯 2025-05-10 加星标!天天中午 12:15 一起学算法之十分好用的二分查找法模板 高清动画+图片+步骤分析,手把手教你如何正确高效的刷这些算法题!!! 艺考资讯 2025-05-10 可敬的寿镜吾老先生:方正博学,重教育而非体罚学生 从百草园到三味书屋作文400字(推荐20篇),篇一:从百草园到三味书屋作文400字可敬的寿镜吾老先生董馨莹鲁迅去到三味书屋学习,认识了寿怀鉴老先生。 艺考资讯 2025-05-10 七月派著名诗人牛汉去世 曾因胡风案第一个遭拘捕 人物简介 牛汉原名史成汉,曾用笔名谷风。山西省定襄县人,蒙古族。1923年生,1953年到人民文学出版社工作,历任现代文学编辑室主任、《新文学史料》主编 艺考资讯 2025-05-10 新文化运动标志新青年创刊历程及人员变动详情 新文化运动兴起的标志是新文化运动兴起的标志是1915年9月,《青年杂志》在上海创刊。该杂志的主编陈独秀认为,要改变中国,必须有文化的觉醒和思想的启蒙。 艺考资讯 2025-05-10 从三味书屋到百草园 朝花夕拾教学分析:目标、重难点及课时安排等详情 《从百草园到三味书屋》教案(教学分析,教学目标),三味书屋则是一个充全不同的世界,作者逼真地写出了三味书屋的陈腐味,说它是 全城中称为最严厉的书塾 艺考资讯 2025-05-10 过故人庄赏析:领略田园诗中农家恬静生活与老友情谊 故人具鸡黍,邀我至田家。绿树村边合,青山郭外斜。开轩面场圃,把酒话桑麻。待到重阳日,还 艺考资讯 2025-05-10 朱强介绍自己及一课研究团队,分享小数与负数相关内容 非负整数是什么我的图文 艺考资讯 2025-05-10 毕业多年学生仍念师恩,熊菊芳老师20年前暖心对话助学生重拾信心 熊菊芳指导学生楚天都市报极目新闻记者 张渊“梅杰,你认识我吗?”“您是熊老师,谁不知道啊,学校的王牌老师!”“那想不想感受下王牌老师的水平,到我的班级好吗? 艺考资讯 2025-05-10 20 世纪初中国新的文化运动:反封建、倡民主科学及文学革新 新文化运动(The New Culture Movement)是20世纪初中国一些先进知识分子发起的反对封建主义的思想解放运动 艺考资讯 2025-05-10