leetcode算法总结 —— 双指针(滑动窗口)

滑动窗口

注意我们的窗口是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++;
}
    1. 长度最小的子数组
    1. 无重复字符的最长子串
    1. 字符串的排列
    1. 找到字符串中所有字母异位词
    1. 最小覆盖子串(思路同上,优化较难)
    1. 至多包含 K 个不同字符的最长子串(该题注意,求最大窗口,那么判断数据处理时机与最小窗口不同)

左右指针

左右指针主要解决数组(或者字符串)中的问题,其中很多是二分查找。
还有一部分是删除重复数据,详见数组。

    1. 汇总区间

头尾双指针

    1. 反转字符串
    1. 两数之和 II - 输入有序数组

快慢指针

快慢指针主要解决链表中的问题,详情见链表总结

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/113484629