先找到符合要求的窗口,然后按照要求寻找最小或者最大,收缩窗口直至不满足要求,在这一过程中会记录关键变量(最小/最大窗口长度),然后再次拓展窗口直至满足条件,再次收缩窗口,依此类推直至搜索到数组最后一个不满足要求的窗口
滑动窗口3大要素:
- 双指针left和right确定当前动态变化的窗口位置;window(dict)记录当前窗口的属性(比如每个字母/数字出现的次数);
- 目标值(比如要求达到某个值或者要求确定一个窗口满足覆盖目标窗口的所有元素,类似这种)的记录(target/need);
- 为了统计目标元素(比如最大/最小)额外设置的一些变量,需要作为函数的返回值res
具体思路在代码中附有注释
209 长度最小的子数组
- medium
- 题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
- 解题思路
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 滑动窗口
leftp = 0
sums = 0 # 记录当前窗口的总和
res = len(nums) + 1 # 当前遍历过的窗口中,长度最小的窗口值
# 不能从1开始遍历,因为会漏掉窗口是[0,0]这种情况
for rightp in range(len(nums)):
sums += nums[rightp]
# 当前窗口整数之和首次超过target,开始从左缩小窗口
while(sums >= target):
temp = rightp - leftp + 1
res = temp if temp < res else res
# 缩小窗口
sums -= nums[leftp]
leftp += 1
return res if res != len(nums) + 1 else 0
904 水果成篮
- medium
- 题目描述
你正在探访一家农场