使用场景:只有当我们数组是恒为正或者恒为负才考虑使用滑动窗口,也就是不能有负数又有正数,这样才能判断出窗口的条件

1.定长滑动窗口

套路非常固定,if i<k-1{continue},记住这是if,不是for,其他滑窗情况是for,是为了让得到第一次符合窗口大小的子串或数组,-1是因为我们是从0开始的,当i等于2就满足k-1的条件的话,那么k就是等于3。这个i本质上是窗口的最右边元素,下一个例子就是最好的诠释。 ​ 更新窗口我们采用的方法是在某一次循环一旦符合窗口大小,然后就进行题中条件的判断,然后就去掉,下一次循环时就又是符合窗口大小的时候了。 ​ 为什么出去的是out:=s[i-k-1],其实就是最左边窗口的元素出去,可以假设i-x+1=k,所以x的索引位置就是x=i-k+1,这个刚好跟i<k-1相同,所以你知道原理后,可以直接方便起见按照i<k-1,直接公式i-(k-1)=i-k+1。也可以假设窗口大小为1,每次移动都是先去掉本身,然后再往下移动,找特殊例子得出公式,这是特殊条件法。 核心套路,直接遍历,然后i<k-1{continue},

我们为了符合滑动窗口的形式,方便计算,这时候我们的i不把他当成中心,而是窗口的最右边值,带入数字计算一下,所以就是i<k*2,窗口大小为7,然后正常算就可以了,唯一要注意的是我们把i当成了i+k,所以带入再算一下就能得到原本i的值是i-k.

这种的是我们只取我们需要的部分进入滑动窗口,你像0我们根本就不进入滑动窗口,所以出去元素的时候,要加一个if判断,只有1才出去。

2.不定长滑动窗口

1.求单个子数组或子字符串

1.求最大

一般题目都有「至多」的要求。 这个简单,一般都是遍历,然后right-left+1,少数题目是right-left,我们可以设定k为1,然后第一个满足大小的窗口满足看看什么情况。 核心套路,left:=0,用right进行遍历,然后超出条件就for判断,然后把left元素出去,left++,最后用max与right-left+1判断符合条件最大值

还有一种是可以来回转变的,加一个if判断就可以了

2.求最小

都不简单,最难的一类

2.求子数组或者子字符串的个数

1.越长越合法

一般要写 ans += left。套路化非常严重 滑动窗口的内层循环结束时,右端点固定在 right,左端点在 0,1,2,…,left−1 的所有子数组(子串)都是合法的,这一共有 left 个。

核心套路,left:=0,遍历数组或字符串,然后超出条件就for判断,然后把left元素出去,left++,最后用+=left得出结果

2.越短越合法

一般要写 ans += right - left + 1。 滑动窗口的内层循环结束时,右端点固定在 right,左端点在 left,left+1,…,right 的所有子数组(子串)都是合法的,这一共有 right−left+1 个。

核心套路,left:=0,遍历right,然后超出条件就for判断,然后把left元素出去,left++,最后用+=right-left+1

3.恰好型滑动窗口

我这就是至少流写法,就是+=left来看,这里我们多加一个right,让left<=right,可以不用想清楚,你就写恰好型窗口加上就行了。