二分法-leetcode

本文深入探讨了二分查找算法在处理逼近类和查找类问题时的循环不变量原则。强调了在不断调整左右边界时,如何确保区间定义的正确性以避免死循环。通过具体的例子解释了当目标不存在或存在时,如何正确更新边界以找到或确认目标不存在。此外,还提到了在不同边界条件下,如何避免左右边界重叠导致的死循环问题,从而确保算法的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:704,278

  • xxxxyyyyyy逼近类,无限逼近xy交界处—感觉这种就相当于底下那种查找类中target不存在的情况

    • 题目链接
    • 取中值,中值属于交界处右边就让右边逼近,反之亦然,临近最后的结构肯定是x|y,然后在这上面做文章
      • 两边同时偏移(+1)left=mid+1左边就会越过中线—这种情况下因为除法是向零取整,所以左边会先跨线
      • left=mid不会越过中线
      • 根据题意,以及上面这两种情况调节跳出循环的条件
  • xxxxxyxxxx查找类,查找y的位置

    • 力扣题目链接
    • 这里要考虑循环不变量原则
      • 当你的right=0,left=nums.size()时,这时你的right ==left在区间[right,left)上是无意义的—因为右端点是不存在的,所以底下设置while条件时只能是left<right, if(num[mid1]>target)则right更新为mid1,这时num[mid1]不等于target,即下一个区间不会去比较num[mid1]
        • 当不存在target时,因为当这个num[mid]卡在界限右边,left卡在左边,因为除法向0取整,所以左边就会left=mid+1,最后叠在right上打破循环条件退出去
        • 当存在target时,如在数组:1,2,3,4,7,9,10中查找元素3,如图所示:这儿如果-1,那么前面那个数可能是但直接就被排除了,因为比较不到它
    • 当你的right=0,left=nums.size()-1时,这时你的right ==left在区间[right,left)上是有意义的,if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1,如果写成middle,target存在的话造成不定影响,增加或减少比较次数,但target不存在的话就会导致达到临界时左边跨过界限,跟右边叠到一块而陷入死循环
  • 大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值