一、概念
- 滑动窗口是一种算法思想,主要用于解决
数组或字符串
的问题。它通过维护一个窗口,在数组或字符串上移动,以寻找满足特定条件的子数组或子字符串。
二、基本思想:
- 使用两个指针left和right来表示窗口的边界。初始情况下,left和right都指向窗口的起始位置。然后,不断移动right指针以扩大窗口,直到满足特定条件。接着,移动left指针以缩小窗口,直到不满足特定条件。然后再次移动right指针,不断循环这个过程,直到遍历完整个数组或字符串。
三、算法框架
滑动窗口算法的框架如下:
- 初始化窗口的左边界left和右边界right,并且将窗口内的数据初始化为一个合法的初始值。
- 开始移动右边界right,不断扩大窗口,直到满足特定条件为止。
- 当窗口满足特定条件时,记录结果(如更新最长子串的长度等)。
- 开始移动左边界left,缩小窗口,直到不满足特定条件停止。
- 重复步骤2到4,直到遍历完整个数组或字符串。
具体来说,可以按照以下步骤来实现滑动窗口算法:
- 初始化left和right指针,以及其他需要的辅助变量或数据结构。
- 使用一个循环来移动right指针,直到满足特定条件。在每次移动right指针时,根据需要更新窗口内的数据、记录结果等。
- 在循环内部判断窗口是否满足特定条件,如果满足,则记录结果。
- 在循环内部使用另一个循环来移动left指针,缩小窗口,直到不满足特定条件。
- 在循环结束后,返回结果。
滑动窗口算法的时间复杂度通常为O(n),其中n为数组或字符串的长度。
四、算法简单示例
找到数组中的最大子数组和,数组为nums,子数组长度K:
public static int maxSubarraySum(int[] nums, int k) {
// 初始化窗口的左边界和右边界
int left = 0;
int right = 0;
// 初始化当前窗口内的和以及最大子数组和
int currentSum = 0;
int maxSum = Integer.MIN_VALUE;
// 开始移动右边界,扩大窗口
while (right < nums.length) {
// 更新当前窗口内的和
currentSum += nums[right];
// 当窗口大小大于 k 时,开始移动左边界,缩小窗