滑动窗口算法

  1. 固定大小的窗口
    窗口的大小在滑动过程中是固定不变的。

举个生动的例子:
你是一名老师,每天检查连续坐在一排的5个学生的作业。你的视线(窗口)每次只能覆盖5个学生。

第一天,你检查第1到第5个学生。

第二天,你不再从头看起,而是向右移动一位,检查第2到第6个学生。此时,你其实已经知道第2到第5个学生的情况了,只需要重点关注新进来的第6个学生和离开的第1个学生即可。

以此类推…

这个过程就是固定窗口滑动:每次移动,窗口吐出左边的一个旧元素,吞进右边的一个新元素

代码步骤:

初始化左右指针 left 和 right,通常都从0开始。

先移动 right 指针来扩大窗口,直到窗口大小达到固定值 k。

此时,窗口大小固定了。进行所需的计算(比如求窗口内元素的和)。

将窗口整体向右移动一格:

将 left 指针向右移动一格(相当于旧元素移出窗口)。

将 right 指针向右移动一格(相当于新元素移入窗口)。

重复步骤3和4,直到 right 指针到达数组末尾。

经典例题: 求长度为k的连续子数组的最大和。

  1. 可变大小的窗口(更常见)
    窗口的大小在滑动过程中是需要变化的,它通常用于解决一些有约束条件的问题(如“最长的无重复字符子串”)。

举个生动的例子:
你在用一条可以伸缩的橡皮筋圈住一些不同的水果。规则是:橡皮筋圈住的所有水果必须种类不同(不能有重复)。

开始时,橡皮筋很小,只圈住第一个水果。

你向右移动,尝试把下一个水果圈进来。如果这个新水果和圈内的都不重复,你就成功扩大了橡皮筋(窗口)。

如果新水果和圈内的某个重复了,你就必须从左边收缩橡皮筋,把重复的那个水果及它左边的所有水果都移出去,直到圈内没有水果和这个新水果重复为止,然后再把它圈进来。

代码步骤(更通用):

初始化左右指针 left 和 right,通常都从0开始。right 指针负责扩大窗口。

不断移动 right 指针,扩大窗口,直到窗口中的元素满足(或不满足)题目的某个要求。

当条件满足后,移动 left 指针来收缩窗口,同时更新结果(比如记录当前窗口的长度是否是最长的)。直到窗口再次不满足条件。

重复步骤2和3,直到 right 指针到达序列末尾。

经典例题: 无重复字符的最长子串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值