给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
提示:
我们可以用一个变量 windowSum
来 维护当前窗口 [i, j]
的和,只在指针移动时更新它,这样每个元素只被访问一次,时间复杂度变成 O(n)。
class Solution {
public:
int minSubArrayLen(int target, vector& nums) {
int n = nums.size();
int left = 0;
int sum = 0;
int minLen = INT_MAX;
for (int right = 0; right < n; right++) {
sum += nums[right]; // 扩大窗口
while (sum >= target) {
minLen = min(minLen, right - left + 1); // 更新最小长度
sum -= nums[left]; // 收缩窗口
left++;
}
}
return minLen == INT_MAX ? 0 : minLen;
}
};
步骤 | 说明 |
---|---|
sum += nums[right] |
扩展右边界,增加当前窗口和 |
while (sum >= target) |
如果窗口的和满足条件,尝试缩小窗口 |
minLen = min(...) |
每次满足条件时尝试更新最小长度 |
sum -= nums[left]; left++ |
收缩左边界,同时维护当前窗口和 |
输入: target = 7, nums = [2,3,1,2,4,3]
过程:
int left = 0;
for (int right = 0; right < nums.size(); right++) {
// 1. 扩展窗口:增加 right 指针
// sum += nums[right];
while (window 满足某个条件) {
// 2. 缩小窗口:尝试移动 left 指针优化答案
// sum -= nums[left];
// left++;
}
}
题目 | 内容 | 技巧 |
---|---|---|
Leetcode 3 | 最长无重复子串 | 哈希 + 滑动窗口 |
Leetcode 76 | 最小覆盖子串 | 字符计数 + 窗口压缩 |
Leetcode 209 | 最短子数组和 | 经典模板 |