leetcode209. 长度最小的子数组---滑动窗口(双指针)

209. 长度最小的子数组—滑动窗口(双指针)

#滑动窗口(双指针)
class Solution(object):
    def minSubArrayLen(self, target, nums):
        n = len(nums)
        lenf = n + 1
        left,right = 0,0 
        sum = 0

        if nums is None or len(nums) == 0:
            return 0
        
        while right < n:
            sum = sum + nums[right]
            right += 1 #注意在这里更新了right,下一次while循环直接可以sum+=操作
            while sum >= target:
                #这里r-l不用+1的原因是上方已经对r进行了下一轮的更新
                lenf = min(lenf,right-left)
                sum = sum -nums[left]
                left += 1 #滑动窗口起始位置向右移动,精髓
        if lenf == n + 1:
            return 0
        else:
            return lenf

第二层的while循环用的妙,倘若不用里面的这个while循环,错误写法:

class Solution(object):
    def minSubArrayLen(self, target, nums):
        n = len(nums) - 1
        left = 0
        right = 0
        sum = 0
        ret = 0
        while right <= n and left <= n:
            sum += nums[right]
            if sum < target:
                right += 1
            elif sum >= target:
                ret = right -left + 1
                sum -= nums[left]
                left += 1
        return ret

看着好像没什么错,但是找个例子推一遍就会发现问题:如果多次满足elif的条件,此时更新的只是leftright并没有更新,但却进行了多次的sum += nums[right],导致sum加了同一个nums[right]多次。这就是为什么运行测试用例时为什么总是返回0的原因

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值