给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
题目分析:注意审题,题目中出现“连续”,且和大于或者小于某值的时候一般采用滑动窗口来做,先定义一个窗口,不满足条件的时候窗口增加,满足的时候打破窗口。
python解题
def minsubarray(alist,s):
#规范写法,第一步要判断数组是否为空
if len(alist) = 0:
return 0
i = j = 0
sum_all = 0
min_len=len(alist)
#当有双指针或者是滑动窗口的时候,需要用while循环,不适合用for循环来遍历数组。
while i < len(alist):
#需要扩大窗口,于此同时需i要对总和进行判断
while j < len(alist) and sum_all < s:
sum_all+=alist[j]
j+=1
#当总和大于s的时候,要打破窗口
sum_all-=alist[i]
i+=1
#判断此时数组之和大于等于s的长度,并更新最小的长度。
if sum_all > = s:
min_len = min(min_len,r-l+1)
return min_len
解法二:
class Solution:
def minSubArrayLen(s, nums):
l = total = 0
ans = len(nums) + 1
for r in range(len(nums)):
total += nums[r]
while total >= s:
ans = min(ans, r - l + 1)
total -= nums[l]
l += 1
if ans ==len(nums):
return 0
else:
return ans