目的
减少while循环
定义窗口 时,left=0 rigth=0 窗口的左右端都在开始位置,然后left++ right++使得窗口往后移动。
例子
常规做法:从第一个元素开始,指针往后移,每三个数相加。
当指针在1时,1+4+2=7
当指针在2时,4+2+3=9
可以看到,4+2被加了两次,有没有什么办法只计算一次4+2呢(不用重复计算这样的步骤呢)
滑动窗口的做法:
窗口是固定的,题目告诉你了3个数之和,因此窗口长度为3.
第一次窗口,1+4+2=7
第二次窗口
7(原来的和)-1(出去的数)+3(新加入的数)=9
第三个窗口同理,减去出去的,加上新加入的。。。。
什么时候用滑动窗口
以k为长度最大的和,最小的和。
题目209
思路
题目中没有定长,不代表我们不能用滑动窗口。
题目要你求连续的数组,因此不能跳,只能连续依次的相加。用滑动窗口 依次往后滑动。即每滑一次,滑出一个元素。
第一步:
首先开一个窗口,不满足
两个窗口,之和还是不满足
三个窗口,不满足
四个窗口,满足!之和为8>7,
和为8,目前最小的长度为4
找到了第一个满足的滑动窗口以后,滑动窗口移动,往后移。
第二步:把2从组合里踢出去,从3开始
不满足,往后扩
满足 和为10>7 最小长度也是4
第三步:把3从组合里踢出去,
和为7=7 刚好满足,最小长度变为了3
第四步:把1踢掉
和为2+4=6 不满足 往后找
扩大窗口
和为2+4+3=9>7 此时最小长度为3 之前也是3 所以不变
第五步:踢掉原来的2
此时的窗口4+3=7刚好满足 最小长度为2
伪代码
代码
题目1456
思路+代码
第一种方法:(计数函数)
遇到数组里面符合的数,加一
否则不加。然后
给定了长度k
想到用滑动窗口
依次往后滑