滑动窗口算法详解
滑动窗口是一种利用双指针维护动态区间的高效技巧。通过移动左右指针来扩大或缩小窗口,我们可以在一次遍历中完成计算,时间复杂度通常为 O(n)。
典型应用:寻找最长无重复字符的子串、找到和为目标值的最短子数组、字符串的排列匹配等。
核心思路
一般步骤可以概括为:
- 定义 left 和 right 指针,初始指向首元素;
- right 向右移动(进窗口),模拟数据进入;
- 当不满足条件时,left 向右移动(出窗口),移除数据;
- 根据具体情况更新结果。
结束条件通常是 right 越界。下面我们通过几个经典题目来深入理解。
209. 长度最小的子数组
题目描述:给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
核心思路:由于数组元素均为正整数,求和具有单调性,可以直接套用模板。
- 定义 left 和 right 指针,同时指向首元素;
- right 指针向右移动,进窗口并累加 sum;当 sum ≥ target 时,更新结果;
- left 指针向右移动,出窗口,同时让 sum 减去 nums[left],直到 sum < target。
注意:在出窗口过程中,如果仍满足 sum ≥ target,也要继续尝试更新结果,以获取更小的长度。
图解示意:

代码实现:
class Solution {
public:
int minSubArrayLen(int target, vector<>& nums) {
left = , right = ;
len = INT_MAX, sum = ;
(right < nums.()) {
sum += nums[right];
(sum >= target) {
len = (len, right - left + );
sum -= nums[left++];
}
right++;
}
len == INT_MAX ? : len;
}
};




