- 固定大小的窗口
窗口的大小在滑动过程中是固定不变的。
举个生动的例子:
你是一名老师,每天检查连续坐在一排的5个学生的作业。你的视线(窗口)每次只能覆盖5个学生。
第一天,你检查第1到第5个学生。
第二天,你不再从头看起,而是向右移动一位,检查第2到第6个学生。此时,你其实已经知道第2到第5个学生的情况了,只需要重点关注新进来的第6个学生和离开的第1个学生即可。
以此类推…
这个过程就是固定窗口滑动:每次移动,窗口吐出左边的一个旧元素,吞进右边的一个新元素。
代码步骤:
初始化左右指针 left 和 right,通常都从0开始。
先移动 right 指针来扩大窗口,直到窗口大小达到固定值 k。
此时,窗口大小固定了。进行所需的计算(比如求窗口内元素的和)。
将窗口整体向右移动一格:
将 left 指针向右移动一格(相当于旧元素移出窗口)。
将 right 指针向右移动一格(相当于新元素移入窗口)。
重复步骤3和4,直到 right 指针到达数组末尾。
经典例题: 求长度为k的连续子数组的最大和。
- 可变大小的窗口(更常见)
窗口的大小在滑动过程中是需要变化的,它通常用于解决一些有约束条件的问题(如“最长的无重复字符子串”)。
举个生动的例子:
你在用一条可以伸缩的橡皮筋圈住一些不同的水果。规则是:橡皮筋圈住的所有水果必须种类不同(不能有重复)。
开始时,橡皮筋很小,只圈住第一个水果。
你向右移动,尝试把下一个水果圈进来。如果这个新水果和圈内的都不重复,你就成功扩大了橡皮筋(窗口)。
如果新水果和圈内的某个重复了,你就必须从左边收缩橡皮筋,把重复的那个水果及它左边的所有水果都移出去,直到圈内没有水果和这个新水果重复为止,然后再把它圈进来。
代码步骤(更通用):
初始化左右指针 left 和 right,通常都从0开始。right 指针负责扩大窗口。
不断移动 right 指针,扩大窗口,直到窗口中的元素满足(或不满足)题目的某个要求。
当条件满足后,移动 left 指针来收缩窗口,同时更新结果(比如记录当前窗口的长度是否是最长的)。直到窗口再次不满足条件。
重复步骤2和3,直到 right 指针到达序列末尾。
经典例题: 无重复字符的最长子串。
3209

被折叠的 条评论
为什么被折叠?



