本系列旨在介绍编程题中最常见的 16 种模式[1]。对于每一种模式会介绍其基本原理,应用场景以及经典的例题。
1. 滑动窗口(Sliding Window)
基本原理及应用场景
滑动窗口模式指对一个给定的数组或链表以特定的窗口大小进行所需操作,例如找出只包含 1 的最长子数组。滑动窗口一般从最左边第一个元素开始,每次向右移动一个元素,并根据要解决的问题调整窗口的长度。某些情况下,窗口的大小不需要调整,而其他情况下则需要增大或减小窗口大小。
![10e134cc5309cf904ff7f329a916ee39.png](https://img-blog.csdnimg.cn/img_convert/10e134cc5309cf904ff7f329a916ee39.png)
在以下场景中,我们可能会用到滑动窗口:
- 问题的输入是一个「线性数据结构」,例如链表、数组或字符串
- 问题的目标是找出「最长/最短」子串、子数组或是目标值
- 普通(暴力)解法的时间复杂度相当高
经典例题
下面给出三道不同难度的通过滑动窗口求解的经典例题:
643. 子数组最大平均数 I(Easy)
给定
n
个整数,找出平均数最大且长度为k
的连续子数组,并输出该最大平均数。