[算法]滑动窗口技巧在算法题中的应用总结

329

前言

概序

对于滑动窗口这个概念,可能之前有学习TCP/IP协议的朋友有比较熟悉的印象,TCP滑动窗口分为接受窗口,发送窗口滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。而本次探讨的是在解题的一种思路。最初我学习到类似滑动窗口的概念是在《数据结构与算法分析 Java语言描述》遇到一个求最大子序列和问题,后来又在LeetCode遇到不重复字串的问题。两者解法有点类似。总结下来,参考前人的经验,了解了一种特别的处理方法叫滑动窗口。滑动窗口解题过程是指,通过选定左下标$P_$与右下标$P_$截取有序集合$A$的子集,进而通过判定该子集是否符合问题的解。在本篇博客中我想收集几个能够用于滑动窗口的例子。

包含的算法题目

  1. 《数据结构与算法分析 Java语言描述》-最大子序列和问题:
    给定(可能有负)的整数$A_{1},A_{2},··· ,A_{N}$,求$\sum_{k=i}^jA_{k}$的最大值。
    输入: -2,11,-4,13,-5,-2
    输出: 20
    解释: 从$A_{2}$到$A_{4}$,元素连续字子集中只有这个子集的和最大

  2. LeetCode-3. 无重复字符的最长子串:
    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    输入: s = "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

  3. LeetCode-76. 最小覆盖子串:
    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
    注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
    提示:
    1 <= s.length, t.length <= 105
    s 和 t 由英文字母组成
    进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?
    示例:
    输入:s = "ADOBECODEBANC", t = "ABC"
    输出:"BANC"

  4. LeetCode-209. 长度最小的子数组:
    给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
    输入:s = 7, nums = [2,3,1,2,4,3]
    输出:2
    解释:子数组 [4,3] 是该条件下的长度最小的子数组。

  5. LeetCode-438.找到字符串中所有字母异位词
    给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
    字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
    说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。
    输入: s: "cbaebabacd" p: "abc"
    输出:[0, 6]
    解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词,起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。

  6. LeetCode-567. 字符串的排列:
    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
    换句话说,第一个字符串的排列之一是第二个字符串的子串。
    输入: s1 = "ab" s2 = "eidbaooo"
    输出: true
    解释: s2 包含 s1 的排列之一 ("ba").

  7. 其它

解析

参考

  1. 马克·艾伦·维斯(Mark Allen Weiss) 著,冯舜玺 陈越 译 ,《数据结构与算法分析 Java语言描述》,第2.2节 要分析的问题, 第22页至第23页

  2. labuladong: 滑动窗口技巧

  3. 一文带你 AC 十道题【滑动窗口】

  4. 张翼腾,复旦大学,数学与应用数学专业, 《滑动窗口算法》

  5. IEEE Localization with Sliding Window Factor Graphs on Third-Party Maps for Automated Driving

  6. 常东亚,严建峰,杨 璐,刘晓升等,《基于滑动窗口的主题模型》
    计算机科学,第 43卷 第 12期