**209. Minimum Size Subarray Sum 长度最小的子数组

时间:2022-01-01 04:29:14

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