双指针处理可变窗口
扩张和收缩窗口以满足条件
双指针处理可变窗口 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 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 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「双指针处理可变窗口」这节课中我会学到什么?
扩张和收缩窗口以满足条件 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「双指针处理可变窗口」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。