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

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

 




posted @ 2019-05-01 21:48  三年一梦  阅读(208)  评论(0编辑  收藏  举报