长度最小的子数组
**问题**
给定一个含有 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