固定大小窗口求和
在 O(n) 内滑动长度为 k 的窗口
固定大小窗口求和 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
重复求和问题
许多任务要求计算每个由连续 k 个元素组成的块的总和。从头重新计算每个块很浪费,您可以做得更好。🪟
先看低效做法
朴素方法会分别计算每个长度为 k 的窗口的总和。这样会重复工作,复杂度为 O(n × k),对于大型输入来说太慢。
for i in range(n - k + 1):
s = sum(a[i:i + k])关键洞察
相邻窗口几乎完全重叠。向右移动一步时,只需移除最左侧的元素,并在右侧加入一个新元素。
初始化第一个窗口
首先计算一次前 k 个元素的总和。这个总和会作为基础值,在窗口向前滑动时持续更新。
window = sum(a[:k])
best = window向右滑动一步
要移动窗口,请加上进入窗口的元素,并减去离开窗口的元素。这样每一步只需进行 O(1) 的工作。
for i in range(k, n):
window += a[i] - a[i - k]跟踪答案
每次滑动后,更新您需要的内容,例如目前为止见过的最大值窗口总和。窗口的值始终可以立即得到。
best = max(best, window)总开销是线性的
每个元素都会被访问一次以加入总和,又被访问一次以移除,因此整个扫描的复杂度为 O(n)。这可以轻松满足大型数据规模的限制。
注意索引
离开窗口的元素是 a[i - k],而不是 a[i - 1]。正确处理这个偏移量是固定窗口中最常见的错误。
平均值也能轻松得到
如果需要的是窗口的最大平均值而不是总和,只需将记录的窗口总和除以 k。滑动逻辑完全不变。
avg = window / k处理较小数组
如果数组短于 k,就不存在完整窗口。请预先检查 len(a) 是否小于 k,并提前返回,以避免索引错误。
if n < k:
return None适合使用固定窗口的场景
当窗口的长度固定,并且可以廉价地组合其中的值时,请使用这种模式,例如计算总和、计数或简单的增量统计量。
快速检查
您正在将大小为 k 的窗口沿数组逐步向右滑动。
回顾
只需初始化一次第一个窗口,然后在每一步通过加上并减去元素,以 O(1) 的开销滑动窗口。整个固定大小的扫描在线性时间内完成。✅
常见问题解答
「固定大小窗口求和」课时是免费的吗?
是的 — 「固定大小窗口求和」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「固定大小窗口求和」这节课中我会学到什么?
在 O(n) 内滑动长度为 k 的窗口 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「固定大小窗口求和」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。