定长滑动窗口
定长滑动窗口
引入
计算所有长度恰好为 k 的子串中,最多可以包含多少个元音字母:
- 暴力枚举所有子串?太慢
- 如何以 $O(1)$ 时间复杂度计算出子串的元音个数?
通过定长滑动窗口,只考虑离开滑动窗口和进入滑动窗口的字母,即可实现这一点,因为中间部分的字母与上一个循环选中的字母相同,如果在下一个循环中重新运算,则出现了冗余计算。
步骤
一个基本的定长滑动窗口模板如下:
- 进入窗口
- 退出窗口
- 更新相关统计量
模板
右指针通过 for 循环移动,左指针通过循环内条件移动:
- 进入窗口(此时窗口长度为 k+1)
- 退出窗口(当窗口长度为 k+1 时,退出窗口)
- 更新值(经过上述操作后,窗口长度恰好为k,此时更新数值)
1 | class Solution { |
练习
- 1456. 定长子串中元音的最大数目
- 643. 子数组最大平均数 I
- 1343. 大小为 K 且平均值大于等于阈值的子数组数目
- 2090. 半径为 k 的子数组平均值
- 2379. 得到 K 个黑块的最少涂色次数
- 1423. 可获得的最大点数
- 1052. 爱生气的书店老板
1423. 可获得的最大点数
关于这个问题共有两种思考方式,一种是正向思维,采用前后拼接的方式,再进行滑动窗口,就是我自己的做法
1 | class Solution { |
这种做法的空间复杂度是 O(k) 因为采用了额外的空间进行拼接,除此之外,还可以采用逆向思维:
1 | class Solution: |
这种做法不需要消耗额外空间,空间复杂度为 O(1)。
进阶
3439. 重新安排会议得到最多空余时间
时间块的滑动等价于相邻空闲块的合并,”很容易“(一点都不容易)看出两个空闲块的合并可以由一次移动块操作得来,并可以等价的出现在左侧或者右侧;那么,问题就可以转换为进行k次合并,所得到的最大连续空闲块长度,即定长滑动窗口问题
tips
这种贪心问题始终不太会做,而且及其容易爆零,建议多尝试贪心题
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
