小记滑动窗口
滑动窗口法
所需变量
滑动窗口由三部分构成:边界,条件相关变量,需求记录变量。
边界
边界由两个指针构成,分别称为左边界和右边界。
条件相关变量
条件相关变量是用于存储题目所需条件数值的变量。(例如区间和,区间长)
需求记录变量
需求记录变量是用于算法计划返回的变量,也是题目需求的变量,通常是最大值或最小值(例如区间和最大值,或是满足条件的区间最长长度)
方法步骤
听好了,我只写一遍。
- 所需变量声明
- 进行循环,在循环中不断移动右边界,同时不断更新条件相关变量
- 在每次移动右边界后,检查条件相关变量是否满足需求记录变量,如果满足则进入另一个循环。
- 在另一个循环中,左边界不断移动,更新条件相关变量,记录需求记录变量,直到条件相关变量不满足条件,循环破坏,回到右边界移动的大循环
- 需求记录变量为所求
去跟小伙伴们吹逼
更加易懂的代码版本(也就是模板代码):
1 | def sumWindow(nums: List[int]) -> nums: |
论为什么滑动窗口比暴力快
猜测上,滑动窗口采用了一种特别的遍历方法,能够在有效排除不符合条件的组合的同时不排除满足条件的组合。
由于满足条件的数组之间存在有一定相似性,滑动窗口法通过利用这个相似性——在两端移动过程中处于满足条件和不满足条件之间反复横跳,以高效遍历所有可能的组合。
经典为例
给定一个含有 n 个正整数的数组和一个正整数 target。找出该数组中满足其总和大于等于 target 的长度最小的子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
显然可以使用暴力解法,但是本文在此不做提及。
1 | class Solution: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 🐦微语鸟舍🐦!
评论