给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
思路
滑动窗口
窗口起始位置设为a,结束位置设为b
当窗口内数字和sum(nums[a:b])大于等于s时,计算当前窗口长度,与最小长度值比较,记录其中最小的那个,并将窗口收缩(a=a+1)
否则窗口扩张 b=b+1
代码
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
a=0
b=1
min_l=99999999
n=len(nums)
if(n==0):return 0
sum_s=nums[a]
while(a!=n):
if(b-a<min_l and sum_s>=s):min_l=b-a
if(sum_s>=s or b==n):
a=a+1
sum_s=sum_s-nums[a-1]
else:
b=b+1
sum_s=sum_s+nums[b-1]
if(min_l==99999999):min_l=0
return min_l