-
类型:可变长度的滚动窗口(while合法直到不合法)
-
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
-
思路:可变窗口:(1)只有窗口合法时才更新目标,并移动left直到不合法,从而for循环进入下一个right(2)每一步只更新right
-
经验:(1)目标为最小量,初始为math.inf,不要初始为列表长度,会带来特殊值的麻烦(2)循环中每一步的先后顺序,以及是否放入while中都很有讲究。如果赋值时涉及其他变量一定注意两者的先后顺序,如果希望只要在while满足的条件内就一直更新则放入while内。(3)学习return a if condition else b的return写法
#直接用end-start+1记录长度
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left=0
sum=0
min_length=math.inf
for right in range(len(nums)):
sum+=nums[right]
while sum>=target:
min_length=min(min_length,right-left+1)
sum-=nums[left]
left+=1
return 0 if min_length==math.inf else min_length
#用length记录长度
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left=0
sum=0
length=0
min_length=math.inf
for right in range(len(nums)):
sum+=nums[right]
length+=1
while sum>=target:
min_length=min(min_length,length)
sum-=nums[left]
left+=1
length-=1
return 0 if min_length==math.inf else min_length
明日计划:1695. 删除子数组的最大得分