0
点赞
收藏
分享

微信扫一扫

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


文章目录

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

前言

之前写二分法的时候没有章法,乱拳打死老师傅的感觉,我估计大家也是经常在下面几种情况出错:
1.当定义了​​​left​​​和​​right​​​之后,进入​​while​​​循环,到底是​​while(left<right) ​​​还是​​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 (目标值<mid) # 更新左区间的有边界​​​​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<right)​​​​mid = (left+right)/2​
  • 3.然后判断目标值和mid的大小关系,更新左右区间。
    ​if (目标值<mid) # 更新左区间的有边界​​​​right = mid​​​​elif (目标值>mid) # 更新右区间的左边界​​​​left = mid +1​​​​else return mid​​ 这里是​​mid​​而不是​​mid-1​​,因为此处写的是左闭右开区间,可以想象,之前写左闭右闭的时候,两个边界都包含其中,此时左边界包含其中,有边界不包含其中,所以在更新有边界的时候是​​mid​​而不是​​mid-1​​,同理,在更新左边界的时候,是​​left = mid +1 ​

练手题目

​​leetcde 704 二分查找​​

总结

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


举报

相关推荐

0 条评论