滑动窗口
注意我们的窗口是left到right的区间,我们定义的window存储该区间的值,可以存储该区间有用的值或者所有值,这个根据情况来看。
window可以是数组或者map或者。。。
滑动窗口算法框架
int left = 0, right = 0;
while (right < s.size()) {
//窗口增加值
window.add(s[right]);
//判断处理数据的时机,如果求最大滑窗应该放在外面。
//判断何时窗口左边界需要需收缩或滑动(重点判断条件)
while (window needs shrink) {
//判断处理数据时机,如果求最小滑窗,则放在里面
// 窗口移除值
window.remove(s[left]);
//缩小窗口
left++;
}
// 增大窗口
right++;
}
-
- 长度最小的子数组
-
- 无重复字符的最长子串
-
- 字符串的排列
-
- 找到字符串中所有字母异位词
-
- 最小覆盖子串(思路同上,优化较难)
-
- 至多包含 K 个不同字符的最长子串(该题注意,求最大窗口,那么判断数据处理时机与最小窗口不同)
左右指针
左右指针主要解决数组(或者字符串)中的问题,其中很多是二分查找。
还有一部分是删除重复数据,详见数组。
-
- 汇总区间
头尾双指针
-
- 反转字符串
-
- 两数之和 II - 输入有序数组
快慢指针
快慢指针主要解决链表中的问题,详情见链表总结