PrepStack · Markdown HTML

定长滑动窗口

双指针与滑动窗口 · HTML

数学 / 逻辑形态

维护窗口 [r-k+1,r] 的摘要 S。加入 a[r];若窗口超长则移除 a[r-k];长度达到 k 后查询/更新答案。

识别信号

容易误判的相似信号

SignalWhy it is different
长度可变的最长/最短区间若长度由约束决定,需要 while 收缩的 variable window。
任意 k 个元素滑窗只覆盖连续片段;组合选择不是窗口。

核心不变量

处理右端 r 后,摘要精确对应最近至多 k 个元素;只有窗口长度为 k 时才计入答案。

状态、转移与处理顺序

ItemDefinition
Stateright、隐式 left=right-k+1、窗口摘要(和、频次、匹配数)与最佳结果。
Transition加入新右端;当已读元素超过 k 时移除离窗元素;窗口成熟后读取摘要。
Frontier / order宽度固定的连续索引段,随 right 每轮整体右移一格。

Python 骨架

def max_fixed_sum(values, k):
    if k <= 0 or k > len(values):
        return None
    window = sum(values[:k])
    best = window
    for right in range(k, len(values)):
        window += values[right]
        window -= values[right - k]
        best = max(best, window)
    return best

正确性思路

  1. 初始摘要等于第一个长度 k 窗口。
  2. 从前一窗口减去唯一离开的元素、加上唯一进入的元素,得到下一窗口的精确摘要。
  3. 循环按右端顺序覆盖所有且仅所有长度 k 窗口,因此最佳值正确。

复杂度

TimeSpaceParameters
O(n)O(1) 或 O(Σ)n 为序列长;简单和用 O(1),频次表需键域/窗口内不同元素数 Σ。

边界条件

错误模式

PatternWhy it fails / fix
离窗索引差一新元素索引 right 对应离开索引 right-k。
未成熟窗口就更新答案前 k-1 个前缀不是长度 k。
每轮重新 sum 切片退化为 O(nk) 且产生额外切片。

选择与排除规则

相关模板

RelationTemplateBoundary
长度策略变体可变长滑动窗口长度由合法性动态决定。

原创微型例子

环节内容
Result最大定长窗口和为 7。
Setup值 [2,5,-1,4],k=2。
Trace窗口和依次 7、4、3;每次只做一次加减。

Recall prompts

我的补充