- 本质上来说,滑窗是双指针,一根指针指向左端点,一根指针指向右端点。
- 右指针移动可以表示扩张窗口,左指针移动表示缩小窗口。
- 如果当前元素满足题目要求时,可以挪动右指针尝试更优解,并且更新需要记录的变量(元素,元素个数++等)
- 如果当前窗口内的元素不满足条件,可以挪动左指针尝试调整,并且更新需要记录的变量(元素,元素个数--等)
- 通过以上步骤窗口就开始“滑动”起来,在滑动过程中,要记得及时更新答案。一般为求最大或最小。
class Solution:
def slidingWindowTemplate(self,nums: List[int],...) -> int:
# 输入参数有效性判断
if not nums:
return 0
# 申请一个散列,用于记录窗口中具体元素的个数情况
# 这里用数组的形式呈现,也可以考虑其他数据结构
need = []
# 预处理(可省), 一般情况是改变 hash
hashmap = defaultdict()
# left 表示左指针
# count 记录当前的条件,具体根据题目要求来定义
# result 用来存放结果
left= 0
count = ...
result = ...
n = len(nums)
for end in range(n):
# 更新新元素在散列中的数量
hashmap[nums[i] = ...
# 根据窗口的变更结果来改变条件值
if(need[S[i]] == ...) {
count++
}
# 如果当前条件不满足,移动左指针直至条件满足为止
while (count > K || ...) :
...
if (...) :
count--
need[A[left]]++
left++
# 更新结果
results = ...
return results;