Competitive Programming Academy · 课时

双指针处理可变窗口

扩张和收缩窗口以满足条件

第 2 / 4 课13 个步骤

双指针处理可变窗口 是 CoddyKit 上的免费 Competitive Programming Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Competitive Programming Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Competitive Programming Academy 课程共包含 4 节课。

当窗口会伸缩时

有些问题不会固定窗口长度,而是让窗口扩大和缩小,以保持某个条件成立,例如让总和保持在某个限制之下。

两个指针,一个窗口

请使用两个索引,即左和右,标记窗口的两端。右指针不断扩展窗口,而左指针在需要时跟随后移以缩小窗口。

left = 0
window = 0

向右扩展

沿着数组向右遍历每个元素,并将其纳入窗口。更新当前状态,例如将新值加入总和。

for right in range(n):
    window += a[right]

必要时收缩

当窗口不满足规则时,请将左指针向右移动,并移除对应元素。这样无需回退就能恢复条件。

    while window > limit:
        window -= a[left]
        left += 1

读取有效窗口

内层循环结束后,从左到右的窗口就是有效窗口。它的长度为右减左加一,可以直接使用。

    length = right - left + 1

记录最佳结果

使用这个有效窗口更新答案,通常要记录目前见过的最长窗口。每次迭代都要执行此操作,以免遗漏。

    best = max(best, right - left + 1)

为什么是线性的

每个指针都只会向前移动,从不回退。左指针和右指针合计最多前进 n 步,因此整个扫描的复杂度为 O(n)。

单调性要求

当扩展窗口只会让条件变得更难满足时,这种方法才有效。正是这种单调行为让左指针无需回退。

最长窗口与最短窗口

对于最短有效窗口,请在规则仍然成立时持续收缩,并在即将不满足规则前记录结果。指针的移动方式不变。

    while window >= target:
        best = min(best, right - left + 1)
        window -= a[left]
        left += 1

警惕空窗口

如果收缩可能使窗口为空,请防止左指针越过右指针。返回答案前还要确认确实找到了答案。

识别这种模式

当问题要求寻找满足元素条件的最长或最短连续片段时,请考虑使用可变窗口。

快速检查

您正在数组上使用两个指针维护一个可变窗口,数组大小为 n。

回顾

向右扩展以纳入元素,当规则被破坏时收缩左侧,并记录每个有效窗口。指针只向前移动,因此复杂度为 O(n)。✅

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「双指针处理可变窗口」课时是免费的吗?

是的 — 「双指针处理可变窗口」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Competitive Programming Academy 课程的其余内容,请升级到 CoddyKit PRO。 Competitive Programming Academy 课程共包含 4 节课。

「双指针处理可变窗口」这节课中我会学到什么?

扩张和收缩窗口以满足条件 你通过在浏览器中直接运行的动手代码来练习 Competitive Programming Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Competitive Programming Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Competitive Programming Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「双指针处理可变窗口」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Competitive Programming Academy 课中编写并运行代码吗?

能。每节 Competitive Programming Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 固定大小窗口求和
  2. 双指针处理可变窗口
  3. 最长无重复子串
  4. 统计满足规则的窗口
← 返回 Competitive Programming Academy