LeetCode #209 · 长度最小的子数组
Medium
Array
Sliding Window
Prefix Sum
英文题名:Minimum Size Subarray Sum
描述:给定一个正整数数组 nums 和一个正整数 target,找出总和 ≥ target 的长度最小的连续子数组,并返回其长度。若不存在,返回 0。
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
示例 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
约束: 1 ≤ target ≤ 1e9, 1 ≤ nums.length ≤ 1e5, 1 ≤ nums[i] ≤ 1e4
复杂度要求: O(n) 时间, O(1) 空间
📐 阶段4 · 滑动窗口表示
核心不变量:窗口 [left, right] 内元素和 window_sum 始终为当前窗口总和。当 window_sum ≥ target 时,尝试收缩 left 以寻找更短长度。
left: 0
right: 0
sum: 0
min_len: Infinity
🚀 阶段6 · 迁移练习:LeetCode 713 乘积小于 K 的子数组
迁移题:给定正整数数组 nums 和整数 k,返回子数组内所有元素乘积严格小于 k 的连续子数组的个数。
示例: nums=[10,5,2,6], k=100 → 输出 8
算法拼装
逐帧动画 (迁移)
🎯 Skill 总结
核心不变量:窗口乘积 product 始终为当前窗口内所有元素的乘积。当 product ≥ k 时,收缩左边界。
计数技巧:固定右端点 right,满足条件的左端点 left 到 right 之间的所有子数组都有效,数量为 right-left+1。
迁移方向:从 sum 到 product,从最短长度到计数。