**问题**
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
**注意问题**
子数组的定义:一个或**连续
**多个数组中的元素组成一个子数组(子数组最少包含一个元素), 注意这个连续。
**解决方法**
解决方法可以分为两种,第一种是暴力破解法,也是最直观的方法,第二种是滑动窗口的方法
**暴力破解法**
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 初始 将min_value 设置为无穷大
min_value=float('inf')
flag=0
input_len=len(nums)
for i in range(input_len):
tmp_value=0
for j in range(i,input_len):
# 进行嵌套的遍历 因为找的是子数组 具有连续性
tmp_value+=nums[j]
# 如果大于target,就和min_value进行比较,选择最小的
if tmp_value>=target:
min_value=min(min_value,j-i+1)
flag=1
# 如果值大于target 就结束改循环
break
if flag:
return min_value
else:
return 0
但是上述的解决方法的时间复杂度在N 方,怎么优化这个暴力破解法呢,我们采用滑动窗口,变动右指针,如果当前的累加值是大于目标值,那就移动左指针,找最小的子数组,代码如下:
**滑动窗口法**
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 初始 将min_value 设置为无穷大
min_value=float('inf')
left=0
num_len=len(nums)
tmp_value=0
# 一直往右走
for j in range(num_len):
tmp_value+=nums[j]
while tmp_value>=target:
min_value=min(min_value,j-left+1)
# 往左边滑动,来找最小的子数组
tmp_value-=nums[left]
left+=1
return min_value if min_value!=float('inf') else 0