滑动窗口适合在题目要求连续的情况下使用
模板:
/* 滑动窗口算法框架 */
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]
即可满足条件