🤖 AI文章摘要 qwen-turbo-latest
加载中...

滑动窗口

窗口的作用在于标记区间的元素并存储窗口当前的数据状态,窗口滑动时利用相邻窗口的相关性计算下一个窗口的数据状态来提高计算效率。

滑动窗口适用于以下问题情形:

  • 需要重复计算重叠区间数据的数据状态。
  • 重复区间数据具备数据相关性。

定长滑动窗口

定长滑动窗口适用于重叠数据区间长度一致的情况。

  • 确定窗口大小,假设为$w$。
  • 计算第一个窗口的结果并进行存储。
  • 通过循环逐步移动窗口并通过上个窗口的计算结果计算出当前窗口的结果。

可变滑动窗口

可变滑动窗口适用于重叠数据区间长度不一致的情况,可变滑动窗口使用了双指针来操作窗口的大小以及移动窗口。

  • 通过移动窗口右指针扩展窗口,通过移动左指针缩小窗口,直至窗口计算结果符合条件。
  • 如果计算结果符合条件,进行相应的处理后,移动左指针重复步骤1。
  • 重复步骤1和步骤2,直到所有数据被处理。(结束条件根据问题需求而定)

使用示例

滑动窗口示例1

非负数组arr长度为k的子组数中,求和的最大值 传统的思路是循环所有子数组起始位置时内嵌循环进行子数组的求和叠加并进行最大值比较,假设子数组长度为$k$,这个方法的时间复杂度为$O(k*n)$。可以发现子数组间存在数据重叠求和进行了很多重复的加法计算,优化的思路是使用定长滑动窗口的思想缓存和复用累加结果,优化后的时间复杂度为$O(n)$。

滑动窗口示例2

非负数组arr求和大于k的子数组中,长度的最小值
传统的思路是循环所有子数组起始位置时循环累加起始位置后面的元素至求和刚大于k时,比较并记录当前长度,这个方法的时间复杂度为$O(n^2)$。可以发现子数组累加时进行了很多重复的加法计算,优化的思路是使用可变滑动窗口的思想缓存和复用累加结果,但这里使用的是可变滑动窗口求解,优化后的时间复杂度为$O(n)$。