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


    前言

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

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

    [x,y] 左闭右闭写法:

    • 1.先定义left和right
      left = 0
      right = 目标数组长度-1

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

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

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

    [x,y) 左闭右开写法:

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

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

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

    练手题目

    leetcde 704 二分查找

    总结

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

  • 相关阅读:
    Python 潮流周刊第 46 期(摘要)+ 赠书 7 本
    1 随机事件与概率
    DreamScene2 免费WIndows 动态桌面壁纸播放软件启动无响应失败问题解决及安装使用帮助
    性价比较高的无线蓝牙耳机,300以内高音质蓝牙耳机推荐
    【Leetcode】 96. 不同的二叉搜索树
    Springboot集成JUnit5优雅进行单元测试
    第十八篇-推荐-Huggingface-镜像-2023-11
    CV计算机视觉每日开源代码Paper with code速览-2023.10.11
    Python怎么打印彩色字符串
    Java ClassLoader definePackage()方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/qq_38737428/article/details/126817150