类别

  • 该算法主要分为定长滑动窗口和不定长滑动窗口,前者由于窗口大小固定,往往是来求窗口内某种极值,极大、极小或者其它事物,后者则专注于求子数组/子字符串的数量。

  • 不定长滑动窗口有的会尽可能追求窗口长度的极值,又会因为题目,细分几个种类,比如越长越满足、越短月满足,或者刚好满足的情况。

定长滑动窗口

  • 基本的思路是,先是初始化一个定长的窗口,初始化到窗口长度减一,然后在循环过程中,先加入新元素,达到窗口满足大小的情况,然后自行检查窗口是否满足题目条件,并更新记录数值。随后退出最旧的元素。

  • 示例题目与更为详细的思路讲解在博客 【Leetcode Daily】1456定长子串中元音的最大数目

不定长滑动窗口

  • 与定长滑动窗口的不同之处在于,不需要开始先把窗口调整至某个状态,只需要不断地加入元素,检查条件,然后在不满足条件时,持续退出旧元素,直到再次满足条件。

  • 至于几种分类,对于求满足条件窗口长度,只要每次循环持续更新记录数值的最大或最小就好,像是博客 【Leetcode Daily】2904最短且字典序最小的美丽子字符串

  • 而子数组长度,对于越长越合法类型,相当于遍历右节点,统计左节点的可能,每次满足条件,就直接加上左节点的下标值到结果上,因为该左节点与其更左的节点下标都一定会满足,“越长越合法”嘛,比如博客 【Leetcode Daily】1358包含所有三种字符的子字符串数目

  • 于此相对,“越短越合法”则是满足条件后,给结果累计 right-left+1 的下标,比如博客 【Leetcode Daily】713乘积小于K的子数组