首页 > 其他分享 >二分查找的循环条件及指针终止位置问题

二分查找的循环条件及指针终止位置问题

时间:2024-07-09 19:09:12浏览次数:17  
标签:二分 边界 指向 位置 mid 查找 移动 指针

二分查找的循环条件及指针终止位置问题

常见的二分搜索法的循环迭代方法分为:左闭右开左闭右闭 两种方式

  • 左闭右开:由于右边界开放,例如[1,1)是矛盾的,因此循环条件为while(l<r)。闭合指后续迭代仍需要进行对其元素进行比较。因此每次迭代结束,左指针l移动到中点的下一位l = mid+1,而不需要移动到中点位置,因为中点位置已被和目标值比较过;开放意味着后续不需要再进行比较,因此每次右指针r需要移动到已经比较过的中点位置mid

  • 左闭右闭:由于右边界闭合,例如[1,1]是合理的,因此循环条件为 while(l<=r);由于左右边界都闭合,这意味着后续迭代需要对左右边界即lr指向的元素进行判断。因此每次迭代结束,左指针l移动到中点的下一位l = mid+1,右指针r移动到中点的前一个位置r = mid-1,因为mid位置已经被比较过了。

详细解释为什么while(l<r)时需要右指针r移动到mid,而while(l<=r)时需要右指针r移动到mid-1:首先,这两种情况下,每次循环的不变量都是左指针要移动到mid的下一位(左闭)。

  • while(l<r)时,我们考虑l+1=r这种情况,即l指针位于r指针的前一位,此时mid指向l:(1)若目标值target < nums[mid]=nums[l],此时r指针移动到mid也就是l的位置,l=r正常结束。(2)若目标值target > nums[mid]=nums[l]l指针移动到mid的下一位r的位置,此时l=r循环结束,但r指向的元素未被判断。这就要求我们在先前已经对右指针r指向的元素进行过判断,结束才是合理的。因此,因此当移动右指针时,我们必须保证右指针指向的元素是在先前已经被判断过的,所以每次右指针要移动到mid的位置,若移动到mid-1,那么r指针指向的位置就没有被判断,在上述情况下,就是错误的结束。同时这就是 右开 的由来,每次循环不用判断r指向的元素,因为它在上次移动到的是已经比较过的元素的位置。

  • while(l<=r),同样考虑l+1=r这种情况:(1)情况同上相同。(2)当目标值target > nums[mid]=nums[l]时,l指针移动到mid的下一位r的位置,l=r仍未结束,此时mid=l=r对r进行判断。这意味着右指针r指向的元素在后续会被判断到,这就要求,我们每次迭代改变右指针r的位置时,是先前未被判断过的即可,即每次r指针移动到mid-1的位置。这是 右闭 的由来,因为右边界r的指向未被比较过,需要在后续比较。

mid = ( l + r ) / 2下,指针终止情况

针对以上两种循环迭代方法,本文枚举了所有指针终止位置的情况。其中包括不引入辅助元素、引入左边界辅助元素、引入右边界辅助元素以及同时引入左右边界辅助元素时,左右指针的终止位置情况。旨在将规律具象化,便于理解。(注:在不越界的情况下,令 mid = ( l + r ) / 2)

不引入辅助元素

引入左边界

引入左边界

引入右边界

引入右边界

引入左右边界

引入左右边界

总结

左闭右开:

  • 在不引入辅助边界的情况下,除了大于右边界的目标值,左右指针lr共同指向第一个大于目标的数
  • 当引入了右辅助边界时,左右指针lr共同指向第一个大于目标的数。

左闭右闭:

  • 无论是否引入左右辅助边界,右指针r始终指向小于目标的最近位置的数,左指针l始终指向大于目标的最近位置的数


mid = ( l + r + 1) / 2下,指针终止情况

mid = ( l + r +1) / 2

标签:二分,边界,指向,位置,mid,查找,移动,指针
From: https://www.cnblogs.com/wangzhen996/p/18292525

相关文章

  • 代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和
    2024年7月9日题454.四数相加II使用哈希表,分为两块,前两个数组找出各种情况,统计次数,时间复杂度为O($n^2$),后两个数组在找到各种情况的时候直接用哈希表去处前两个数组符合的相应次数即可。classSolution{publicintfourSumCount(int[]nums1,int[]nums2,int[]nums3,......
  • 函数指针与回调函数
    #include<iostream>usingnamespacestd;//函数指针就是指向函数的指针/**用途:   函数A要作为实际参数传递给函数B,在B中调用,应该就是回调函数。这时候就要用函数指针。   因为有些功能是流程中的一部分,但是不清楚,需要个性化,只能把公共流程写好,中间穿插个性化内容,   ......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • 【C语言】指针(3):探索-不同类型指针变量
    目录一、字符指针变量二、数组指针变量三、二维数组传参的本质四、函数指针变量4.1函数指针变量4.2函数指针变量的使用4.3函数指针变量的拓展五、函数指针数组六、转移表的应用通过深入理解指针(1)和深入理解指针(2),我们对指针有了一个初步的了解,学会了一级指针、二......
  • 代码随想录(day1)二分法
    if语句的基本语法if要判断的条件:条件成立的时候,要做的事举例:ifnums[middle]<target:left=middle+1while语句的基本语法:while判断条件(condition):'''执行语句(statements)'''举例:whileleft<=right:middle=left+(right-left)//2题目:代码:class......
  • LeetCode42(接雨水)[三种解法:理解动态规划,双指针,单调栈]
    接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。这是一道困难题,难度确实有点层次.我们先来朴素思想走一波.要求能接多少雨水,我们可以具化到每个硅谷,每个硅谷能存多少雨水,那么答案就是每个硅谷的雨水所加之和.对......
  • 大厂面试高频题——二分查找
    35.搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。思考二分模板题classSolution:defsearchInsert(self,nums:List[int],target:in......
  • 大话C语言:第29篇 指针
    1指针概念指针:地址的变量化形式,其存储的是内存中某个存储单元的地址。它是地址的数值表示。指针变量:一种特殊的变量,它专门用于存放变量的地址(即指针)。注意,指针和指针变量的区别:指针本身是一个地址,这个地址指向内存中的一个存储单元。它只是一个内存地址的抽象表示,没......
  • 二分
    二分\(\sf\small\color{gray}Binary\)思想要想区分不同,又想种类最少,“二”这个数值可谓是不二人选。原因很简单。因为1+1=2。那你是不是就可以取一个中间值,把一串数据分成两部分,然后依据这个中间值判断目标值是在左边还是右边?二分查找就出来了。二分查找就是在一个\(\s......
  • C语言 指针和数组——指针数组的应用:命令行参数
    目录命令行参数演示命令行参数与main函数形参间的关系命令行参数什么是命令行参数(CommandLineArguments)?GUI界面之前,计算机的操作界面都是字符式的命令行界面(DOS、UNIX、Linux)例如,在DOS下拷贝文件用copyfile1.cfile2.c不......