定长滑动窗口套路

定长滑动窗口三步法总结

当窗口右端点在位置 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;
    }
}
posted @ 2026-04-08 20:32  可以解决问题不大  阅读(21)  评论(0)    收藏  举报