209. 长度最小的子数组
给定一个含有n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
思路:
本题最关键的就是要注意审题,题目中要求找出的是长度最小的连续子数组(连续敲重点),因此可以采用滑动窗口的思想来解题,即当窗口内数组和sum
小于target
时,窗口右端向后移,扩大窗口大小;当窗口内数组和sum
大于等于target
时,窗口左端向后移,缩小窗口大小;此解题形式类似于双指针的方法。
定义两个指针fast
指针与slow
指针,初始位置指向数组第一个元素,其中fast
指针指向窗口右边界,slow
指针指向窗口左边界,窗口的移动可以看成指针的移动,当fast
指针移出数组时,停止窗口移动。
在实际编程阶段有几个小点需要注意:
- 当数组所有元素之和仍小于
target
时,直接返回0,无需从头开始移动; - 当
slow
指针与fast
指针相遇时,fast
指针需要后移,但slow
指针不动。
代码如下:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, right = 0, 0
L = list()
if sum(nums) < target:
return 0
while right <= len(nums):
if sum(nums[left:right+1]) < target:
right += 1
else:
L.append(right+1-left) # 统计符合要求的子数组长度
if left == right:
right += 1
continue
left += 1
return min(L)