滑动窗口系列

滑动窗口适合在题目要求连续的情况下使用

相关题目

模板:

/* 滑动窗口算法框架 */
void slidingWindow(string s) {
    // 用合适的数据结构记录窗口中的数据
    unordered_map<char, int> window;
    
    int left = 0, right = 0;
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        winodw.add(c)
        // 增大窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        // 注意在最终的解法代码中不要 print
        // 因为 IO 操作很耗时,可能导致超时
        printf("window: [%d, %d)\n", left, right);
        /********************/
        
        // 判断左侧窗口是否要收缩
        while (left < right && window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            winodw.remove(d)
            // 缩小窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

知识点:

  • 求子区间个数:以索引为0的子数组个数+以索引为1结尾的子数组个数 + ... + 以索引为n - 1结尾的子数组个数
  • 求子区间的最值/不同元素个数/数组长度在某个区间[l, r]内,可以采用前缀和思想,求出不大于r的熟练,求出不大于l的熟练,cnt[r] - cnt[l - 1]即可满足条件
posted @ 2023-04-12 18:56  bothgone  阅读(15)  评论(0)    收藏  举报