1. 题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出: 2 解释: 子数组[4,3]
是该条件下的长度最小的连续子数组。
2. 思路
双指针法。i和j指针分别是连续数组的两端。如果这个数组的值大于等于s则左指针+1,否则右指针+1。
3. 解法
1 class Solution: 2 def minSubArrayLen(self, s: int, nums) -> int: 3 if sum(nums)<s:return 0 # 如果所有数的和都比s小,那就说明无解 4 i,j=0,-1 # 左右指针,因为我们取左闭又闭区间,所以j初始为-1
5 res = len(nums) # 初始结果为所有数组的长度 6 sums = 0 # 子数组的和 7
8 while(i<len(nums)): 9 if (j+1)<len(nums)and(sums<s): # 注意下面有nums[j+1],所以要加入越界判断 10 j+=1
11 sums+=nums[j] 12 else: # 和已经大于s了,那么就将i右移下 13 sums-=nums[i] 14 i+=1
15 if sums>=s: # 比较看看是否有更好的解 16 res = min(res,j-i+1) 17 return res