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
的条件,此时更新的只是left
,right
并没有更新,但却进行了多次的sum += nums[right]
,导致sum
加了同一个nums[right]
多次。这就是为什么运行测试用例时为什么总是返回0的原因