Skip to content

滑动窗口与双指针

滑动窗口

定长滑窗

例子:

套路:

窗口右端点在下标i时,窗口长度为k,此时窗口左端点下标为i-k+1

三步:

入-更新-出

  1. 入:进入窗口,下标i的元素进入窗口,更新相关统计量。如果窗口左端点i-k+1<0,即i<k-1,则说明窗口还未形成,重复第一步,保证窗口的形成。
  2. 更新:更新答案。一般都是更新最大值/最小值。
  3. 出:下标为i-k+1的元素离开窗口,更新相关统计量,为下一个循环做准备。
java
class Solution {
    public int maxVowels(String s, int k) {
        char[] sArr = s.toCharArray();
        int ans = 0;
        int vowel = 0;
        for (int i = 0; i < sArr.length; i++) {
            // 1. 入
            if (isVowel(sArr[i])) {
                // 更新相关统计量
                vowel++;
            }
            // 窗口大小不足k的情况,保证窗口的形成
            if (i < k - 1) {
                continue;
            }
            // 2. 更新答案
            ans = Integer.max(ans, vowel);
            // 3. 离开窗口,左端点离开
            char out = sArr[i - k + 1];
            if (isVowel(out)) {
                // 更新相关统计量
                vowel--;
            }
        }
        return ans;
    }

    private boolean isVowel(char current) {
        if (current == 'a' || current == 'e' || current == 'i' || current == 'o' || current == 'u') {
            return true;
        }
        return false;
    }
}

Released under the MIT License.