分享丨【题单】滑动窗口(定长/不定长/多指针)
Tip
题单已老, 请点击链接, 查看最新版!
By 灵茶山艾府
右边数字为难度分。
定长滑动窗口
- 1456. 定长子串中元音的最大数目 1263
- 2269. 找到一个数字的 K 美丽值 1280
- 1984. 学生分数的最小差值 1306
- 643. 子数组最大平均数 I
- 1343. 大小为 K 且平均值大于等于阈值的子数组数目 1317
- 2090. 半径为 k 的子数组平均值 1358
- 2379. 得到 K 个黑块的最少涂色次数 1360
- 1052. 爱生气的书店老板 1418
- 2841. 几乎唯一子数组的最大和 1546
- 2461. 长度为 K 子数组中的最大和 1553 (哈希表 + 滑窗)
- 1423. 可获得的最大点数 1574
- 2134. 最少交换次数来组合所有的 1 II 1748
- 2653. 滑动子数组的美丽值 1786 (计数排序(暴力) (数据范围很大应该是 懒删除大小堆 为正解...))
- 567. 字符串的排列
- 438. 找到字符串中所有字母异位词
- 2156. 查找给定哈希值的子串 2063 (数学)
- 2953. 统计完全子字符串 2449
- 346. 数据流中的移动平均值(会员题)
- 1100. 长度为 K 的无重复字符子串(会员题)
- 1852. 每个子数组的数字种类数(会员题)
- 2067. 等计数子串的数量(会员题)
- 2107. 分享 K 个糖果后独特口味的数量(会员题)
不定长滑动窗口(求最长/最大)
- 3. 无重复字符的最长子串
- 1493. 删掉一个元素以后全为 1 的最长子数组 1423
- 2730. 找到最长的半重复子字符串 1502 (语文: 至多一个 <=> 可能为0个)
- 904. 水果成篮 1516
- 1695. 删除子数组的最大得分 1529
- 2958. 最多 K 个重复元素的最长子数组 1535
- 2024. 考试的最大困扰度 1643 (窗口内出现次数最少的
T
/F
的次数需要小于k) - 1004. 最大连续1的个数 III 1656
- 1438. 绝对差不超过限制的最长连续子数组 1672
- 2401. 最长优雅子数组 1750
- 1658. 将 x 减到 0 的最小操作数 1817 (正难则反)
- 1838. 最高频元素的频数 1876 (排序 + 滑窗)
- 2516. 每种字符至少取 K 个 1948 (问两端搞中间)
- 2831. 找出最长等值子数组 1976 (分组循环)
- 2106. 摘水果 2062 (左到右 != 右到左)
- 1610. 可见点的最大数目 2147
- 2781. 最长合法子字符串的长度 2204
- 2968. 执行操作使频率分数最大 2444
- 395. 至少有 K 个重复字符的最长子串
- 1763. 最长的美好子字符串
- 159. 至多包含两个不同字符的最长子串(会员题)
- 340. 至多包含 K 个不同字符的最长子串(会员题)
不定长滑动窗口(求最短/最小)
- 209. 长度最小的子数组
- 1234. 替换子串得到平衡字符串 1878
(难)
- 1574. 删除最短的子数组使剩余数组有序 1932
(难)
(不太会这种: 移除子数组) - 76. 最小覆盖子串
- 面试题 17.18. 最短超串
不定长滑动窗口(求子数组个数)
- 2799. 统计完全子数组的数目 1398 (子数组数量怎么算qwq?!)
- 713. 乘积小于 K 的子数组
- 1358. 包含所有三种字符的子字符串数目 1646 (子数组数量怎么算qwq?! 这里你就理解了)
- 2962. 统计最大元素出现至少 K 次的子数组 1701 (同上的子数组计算方法)
- 2302. 统计得分小于 K 的子数组数目 1808 (同上的子数组计算方法, 但有不同)
- 2537. 统计好子数组的数目 1892 (同上的子数组计算方法, 但是使用哈希统计
arr[i] == arr[j] (i < j)
的对
数) - 2762. 不间断子数组 1940 (有序列表)
- 2972. 统计移除递增子数组的数目 II 2153 (不太会这种: 移除子数组)
- 2743. 计算没有重复字符的子字符串数量(会员题)
多指针滑动窗口
计算可排除前后也可作为子数组的, 问子数组数目, 模版:
0, 1 数组, 问和为goal
的子数组数目. 因为可能存在前后缀 [0,0,0,1,0,0], 0 可以使得窗口移动, 因此我们使用两个指针l1, l2作为前面, (l1)一个负责goal
窗口, (l2)一个负责goal - 1
窗口, 那么就可以得到排除的0
的部分, 最后res += l2 - l1
即可.
class Solution { // 930. 和相同的二元子数组 code
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int n = nums.size(), res = 0;
for (int i = 0, l1 = 0, l2 = 0, sum1 = 0, sum2 = 0; i < n; ++i) {
sum1 += nums[i];
while (l1 <= i && sum1 > goal)
sum1 -= nums[l1++];
sum2 += nums[i];
while (l2 <= i && sum2 >= goal)
sum2 -= nums[l2++];
res += l2 - l1;
}
return res;
}
};
- 930. 和相同的二元子数组 1592
- 1248. 统计「优美子数组」 1624
- 2563. 统计公平数对的数目 1721 (难, 得从后面写起 | 二分)
- 1712. 将数组分成三个子数组的方案数 2079 (二分)
- 2444. 统计定界子数组的数目 2093
- 992. K 个不同整数的子数组 2210
- 1989. 捉迷藏中可捕获的最大人数(会员题)