1.前言
滑动窗口用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。
2. 两种形式
- 非固定长度窗口—快慢指针;如满足某一条件的子数组的最大最小长度。
- 固定长度窗口—双端队列;如满足固定长度、某一条件的子数组中的最大最小值。
3. 非固定长度窗口
3.1 解题框架
1 | left = 0 |
3.2 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
1 | 输入:s = 7, nums = [2,3,1,2,4,3] |
1 | class Solution: |
3.2 无重复字符的最长子串
Leetcode:3 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
1 | 输入: "abcabcbb" |
1 | 输入: "bbbbb" |
1 | 输入: "pwwkew" |
1 | class Solution: |
3.3 最大连续1的个数 III
Leetcode 1004. 最大连续1的个数 III
给定一个由若干 0
和 1
组成的数组 A
,我们最多可以将 K
个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
1 | 输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2 |
1 | class Solution: |
3.4 最小覆盖子串
Leetcode: 76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
1 | 输入: S = "ADOBECODEBANC", T = "ABC" |
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
1 | class Solution: |
1 | class Solution: |
3.5 至多包含两个不同字符的最长子串
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t 。
1 | 输入: "eceba" |
1 | 输入: "ccaabbb" |
1 | class Solution: |
3.6 字符串的排列
Leetcode: 567. 字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
1 | 输入: s1 = "ab" s2 = "eidbaooo" |
1 | 输入: s1= "ab" s2 = "eidboaoo" |
1 | class Solution: |
3.7 串联所有单词的子串
Leetcode 30. 串联所有单词的子串
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
1 | 输入: |
1 | 输入: |
1 | class Solution: |
3.8 最小区间
你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。
我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。
1 | 输入:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]] |
1 | class Solution(object): |
4. 固定窗口
4.1 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
1 | 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 |
1 | 类似于单调队列的思想 |
1 | class Solution: |