链接:209. 长度最小的子数组 - 力扣(LeetCode)
题目描述:
给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其总和大于等于 target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3]是该条件下的长度最小的子数组。
解题思路:滑动窗口
求连续子数组,一般使用滑动窗口,双指针遍历控制窗口左右。
窗口左边不动,右指针进行遍历数组扩大窗口,当窗口内的和 >= 目标数时,先记录当前窗口的长度,更新最小长度,再缩小窗口,左指针left向右移动,窗口内的和变小,继续判断和与目标数的大小,当和>=目标数时重复以上操作,直到和小于目标数时,移动右指针,扩大窗口。
以 target = 7, nums = [2,3,1,2,4,3] 为示例
代码:
class Solution(object):
def minSubArrayLen(self, target, nums):
left = 0
sum = 0
#初始化最小长度为无穷大
len_t = float('inf')
for i in range(len(nums)):
sum = sum + nums[i]
while sum >= target:
len_t = min(len_t,i-left+1)
sum = sum - nums[left]
left += 1
return len_t if len_t != float('inf') else 0