二分区间的左右边界-Leetcode 33题

二分法可以分为二分查找,和二分区间,这两个是有区别的,一定要分清

[l,r]
k=0
// 闭区间,需要等号
for l<=r {
// l<=mid<r
   mid = (l+r) / 2 
   if check(s[mid]) k=mid break
   else if  s[mid] > target {
     r = k
    }else{
     l = k+1
        }
}

二分区间,则分为左边界和由边界,左边界:[0,k] [k+1,n-1],右边界:[0,k-1],[k,n-1]

对于闭区间[l,r]
l<=mid<r :用于返回左区间
mid= (l+r)/2

// l<mid<=mid; 用于返回右区间
mid2= (l+r+1)/2

a[k] 符合左边界条件

使用比较熟悉的闭区间,[l,r],这样不会有数组越界,同时使用使用mid=(l+r)/2, 那么其缩小的方式就固定了,r=k或者l=k+1,这是要避免区间死循环。同时其退出条件为l<=r,因为是闭区间,要保证能够全部访问到

l,r:=0,len(nums)-1
    k:=0
    // 二分法,的边界条件,a[k]要最小
    for l<=r{
        // 下边界效应
        k=(l+r) /2 
        fmt.Println(k)
        // 满足条件 如果使用<=,就可能死循环
        if nums[k] < nums[r]{
            r = k
        }else{
            l = k+1
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值