滑动窗口是一种解决数组/字符串问题的常用技巧。它通常用于需要对连续子序列进行处理的问题,比如求最大值、最小值、平均数、子串匹配等。
以下是几个滑动窗口的经典题目:
- 求一个数组中长度为 k 的连续子数组的最大值
给定一个整数数组和一个整数 k,找出数组中长度为 k 的连续子数组的最大值。
例如,对于数组 [1, 3, -1, -3, 5, 3, 6, 7] 和 k = 3,输出应该是 [3, 3, 5, 5, 6, 7]。
这个问题可以使用滑动窗口来解决。我们首先计算前 k 个元素的和 sum,然后从第 k + 1 个元素开始,每次移动窗口时,我们将当前元素加入 sum 中,将窗口左侧的元素从 sum 中减去。这样,我们就可以在 O(n) 的时间内找到所有长度为 k 的子数组的最大值。
- 求一个字符串中长度为 k 的连续子串的最大字典序
给定一个字符串和整数 k,找出字符串中所有长度为 k 的连续子串中字典序最大的那个。
例如,对于字符串 “abdcfg” 和 k = 3,输出应该是 “cfg”。
这个问题同样可以使用滑动窗口来解决。我们从第一个长度为 k 的子串开始,记录下最大的子串,并且在后续的遍历中,每当发现一个更大的子串时,就更新最大子串。
- 求一个数组中长度为 k 的连续子数组的平均数
给定一个整数数组和一个整数 k,找出数组中长度为 k 的连续子数组的平均数。
例如,对于数组 [1, 3, -1, -3, 5, 3, 6, 7] 和 k = 3,输出应该是 [1.0, -0.33333, 0.33333, 1.66667, 3.66667, 5.33333]。
这个问题同样可以使用滑动窗口来解决。我们首先计算前 k 个元素的和 sum,然后从第 k + 1 个元素开始,每次移动窗口时,我们将当前元素加入 sum 中,将窗口左侧的元素从 sum 中减去。这样,我们就可以在 O(n) 的时间内找到所有长度为 k 的子数组的平均值。