算法原理
滑动窗口算法是一种基于双指针(又称滑动窗口)的算法,是一种常用的数据处理算法,通常用于解决数组或字符串中的子数组或子串问题。
滑动窗口算法的基本思想是使用两个指针left和right来定义一个窗口,窗口内包含满足特定条件的元素子序列,然后不断移动指针left和right来滑动窗口,以找到相应的子序列。
滑动窗口算法的具体步骤如下:
- 初始化左指针left和右指针right,使它们都指向序列的起始位置。
- 将窗口中的元素作为子序列进行处理,满足特定条件的子序列就是算法需要解决的问题。
- 调整指针left和right,使得窗口向右移动:一般来说,先right边界先扩张,到达指定的位置(根据情况来定),然后left开始扩张,直到指定的位置。
- 获得窗口内元素集合,执行业务逻辑,如记录最大值、最小值、求和等。
- 重复上述步骤,直到滑动窗口遍历完整个序列。
由此可见,滑动窗口算法通过定义一个窗口并随着特定条件单向移动,使能够快速找到所需的子序列。
该算法也可以分类如下:
- 固定窗口大小 —— 窗口大小是固定的,左右边界指针的扩张步长是固定的。
- 可变窗口大小 —— 允许窗口大小随问题而变化,并且可以针对不同的问题选择最优的窗口大小。
常见应用场景
算法的优点在于时间复杂度为O(n),其中n为数组或字符串的长度。同时,由于只需要维护一个滑动窗口,算法的空间复杂度也比较低,通常为O(1)。因此滑动窗口算法可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。其可解决的问题,一般有如下特点:
- 目标数据连续的、有序的、前后关联的数据集合。
- 窗口可以通过单向递增(如由左向右滑动)实现移动
编程中常见的应用场景如下:
- 业务接口限流模块,如电商秒杀限流、开放接口请求限流。
- 离线统计业务场景:根据时间、账号等维度排序,以固定滑窗方式渐进执行直到跑完。
- 算法题目如求解“子串的最大不同字符数”、“子数组的最大和”、“最长连续子数组”、“正数组中和为k的最长子数组”等,常见于针对字符串、数组、队列的运算。