一、滑动窗口思路
- 使用双指针技巧,并且初始化 start=end=0 ,注意窗口范围,这里建立建议索引范围左闭右开,即 [start, end)
- 不断增大 end,扩大窗口 [start,end) ,直到窗口满足指定要求
- 满足要求后停止增大 end,转而缩小窗口,即不断增加 start,直到该窗口不满足要求。
并注意适时更新结果
- 重复step2和step3,直到end达到范围尽头
二、模板
以字符串为例
void slideW(String s, String p) {
// 定义记录存储变量
HashMap<Character, Integer> recor = new HashMap();
HashMap<Character, Integer> window = new HashMap();
// 记录待比对的字符串元素
for(int i=0; i<p.length()-1; i++) {
char key = recor.put(key, recor.getOrDefault(key, 0)+1);
}
int start = 0, end = 0;
int valid = 0; //valid用作判断窗口内满足 recor 条件的字符个数
while(end < s.length()) {
// r为送入滑动窗口的元素,并扩大窗口
char r = s.charAt(end++);
// 窗口内数据进行跟更新
...
// 判断左侧窗口是否要收缩
while (condition of shrink) {
// l 为要移出窗口的元素,并缩小窗口
char l = s.charAt(start--);
// 窗口内数据更新
...
}
}
}
三、套模板考虑的问题
- 当 end 扩大时,即窗口加入新元素时,应更新哪些数据?
- 窗口什么时候停止扩大,即移动 start 缩小窗口?
- 当移动 start 时,应该更新哪些数据?
- **结果在什么时候更新?**扩大或缩小窗口时?