定长滑动窗口套路
定长滑动窗口三步法总结
当窗口右端点在位置 i 时,由于窗口长度为 k,所以窗口左端点为 i - k + 1。
我总结为三步:入 → 更新 → 出
1. 入
- 下标为
i的元素进入窗口。 - 更新相关统计量(如和、最大值、最小值、频率等)。
- 注意:如果窗口左端点
i - k + 1 < 0,说明尚未形成第一个完整窗口,跳过“出”步骤,重复第一步直到窗口填满。
2. 更新
- 更新答案(通常是当前窗口的最大值/最小值/满足条件的计数等)。
- 此步骤仅在窗口已完全形成后执行(即
i >= k - 1)。
3. 出
- 下标为
i - k + 1的元素离开窗口。 - 更新相关统计量(移除该元素的影响),为下一个循环做准备。
- 此步骤也仅在窗口已完全形成后执行。
✅ 以上三步适用于所有定长滑动窗口题目!
📌 提示:实际编码中,“入”和“出”通常放在循环内,“更新答案”需判断是否已形成完整窗口(i >= k - 1)。
模板
题目链接:1456. 定长子串中元音的最大数目
点击查看代码
class Solution {
public int maxVowels(String S, int k) {
char[] s = S.toCharArray();
int ans = 0;
int vowel = 0;
for (int i = 0; i < s.length; i++) { // 枚举窗口右端点 i
// 1. 右端点进入窗口
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
vowel++;
}
int left = i - k + 1; // 窗口左端点
if (left < 0) { // 窗口大小不足 k,尚未形成第一个窗口
continue;
}
// 2. 更新答案
ans = Math.max(ans, vowel);
// 3. 左端点离开窗口,为下一个循环做准备
char out = s[left];
if (out == 'a' || out == 'e' || out == 'i' || out == 'o' || out == 'u') {
vowel--;
}
}
return ans;
}
}

浙公网安备 33010602011771号