1、滑动窗口介绍:
滑动: 说明这个窗口是移动的,也就是移动是按照一定方向移动的。
窗口: 窗口大小并不是固定的,可以不断扩容或缩小,直到满足一定的条件;当然也可以是固定大小。
滑动窗口算法的大体流程: 以字符串为例(数组同理)
- 初始化窗口大小: 利用双指针技巧,初始化窗口左右值 left=right=0,[left, right)称为窗口。
- 右移right指针扩大窗口: 逐步扩大窗口,直到窗口中字符串满足一定条件(包含特定字符)。
- 右移left指针缩小窗口: 逐步缩小窗口,直到窗口中字符串不再满足条件(不包含特定字符)。
- 重复步骤2与步骤3: 重复以上步骤,直到right指针到达字符串尾。
流程概括: (1)初始化–>(2)寻找可行解–>(3)优化可行解–>(4)滑动到末尾,找到最优解。
2、滑动窗口用处:
滑动窗口算法用于在给定的数组或字符串上按一定窗口大小执行所需的操作。
可以用来解决一些查找满足一定条件的连续区间性质(长度等)的问题。类似于“请找到满足 xx 条件的最 x 的区间(子串、子数组)的 xx ”的问题。
3、滑动窗口算法模板:
unordered_map<string, int> target; // 统计各目标需要的次数
unordered_map<string, int> window; // 统计当前窗口中各目标出现的次数
int count = 0; // 统计当前窗口与target中目标吻合的次数
int left = 0;
int right = 0;
while (right < s.size()) { // 增大窗口
right++;
// 窗口内数据更新:需要与target判断,是目标才放入窗口中
window.add(s[right]);
while(window needs shrink) { // 判断左侧窗口是否要收缩
// 窗口内数据更新
window.remove(s[left]);
// 缩小窗口
left++;
}
}
4、滑动窗口算法习题:
1、https://leetcode-cn.com/problems/minimum-window-substring/
参考资料:
1、滑动窗口算法框架
2、滑动窗口算法基本原理与实践