← 返回编程题库
coding-max-sum-fixed-window-array简单免费版2000ms未尝试

定长滑动窗口最大和

Max Sum of Fixed-Size Window

开始编码

量化团队把一支股票的逐日收益(以基点为单位)按时间顺序记到整数数组 nums 里。他们想做一个事后统计:回看期内,**任意定长 k 天滚动窗口中累计收益最高的是多少**?换句话说,把一个长度为 k 的窗口从数组左端滑到右端,报告所有窗口里 k 个连续元素之和的最大值。这个值是「最佳 k 日区间收益」基准——常用于把策略实盘 PnL 跟同等长度下「最强连续窗口」对比,或者用来定位最强动量窗口、做行情阶段标签。

请实现 solution(nums: list[int], k: int) -> int,返回所有长度为 k 的连续子数组之和的最大值。若 k > len(nums)k < 1,输入非法,应抛出 ValueError

示例 1(典型)solution([1, 4, 2, 10, 23, 3, 1, 0, 20], 4) 返回 39。所有长度为 4 的窗口分别是 [1,4,2,10]=17[4,2,10,23]=39[2,10,23,3]=38[10,23,3,1]=37[23,3,1,0]=27[3,1,0,20]=24,最大值 39

示例 2(k = 1)solution([-2, -5, -1, -4], 1) 返回 -1。窗口大小为 1 时答案就是最大元素——即使全部为负数公式依然成立(这里没有「不交易」选项:必须选一个长度为 k 的窗口)。

示例 3(k = len(nums))solution([3, -1, 4, -1, 5], 5) 返回 10。只有唯一一个窗口——整个数组,答案是 3 - 1 + 4 - 1 + 5 = 10

朴素的 O(n·k) 双重循环在 n = 10⁵ 时会超时。滑动窗口的关键是:先一次性算好首个窗口的和,之后每滑动一步只做减去离开元素 nums[i - k]、加上进入元素 nums[i],每步 O(1),总共 O(n) 时间、O(1) 额外空间——这就是定长窗口的标准模板。

约束条件

  • 1 ≤ k ≤ len(nums) ≤ 100000
  • -10⁴ ≤ nums[i] ≤ 10⁴
  • 若 `k > len(nums)` 或 `k < 1`,应抛出 `ValueError`
  • 返回值是精确整数,没有浮点误差

样例

Case 1 · typical: window of 4 across mixed values

输入: [[1,4,2,10,23,3,1,0,20],4]

期望: 39

长度 4 的窗口和为 [1+4+2+10=17, 4+2+10+23=39, 2+10+23+3=38, 10+23+3+1=37, 23+3+1+0=27, 3+1+0+20=24],最大值 39 出现在索引 1..4 的窗口 [4,2,10,23]。

Case 2 · k = 1 → max element of an all-negative array

输入: [[-2,-5,-1,-4],1]

期望: -1

k=1 时每个窗口就是一个元素,答案是 max(nums)。即使全部为负数,公式仍正确返回最大(最不负)的元素 -1。

Case 3 · k = len(nums) → only one window, sum of all

输入: [[3,-1,4,-1,5],5]

期望: 10

k 等于数组长度时只有一个窗口——整个数组,答案是元素总和 3+(-1)+4+(-1)+5 = 10。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · typical: window of 4 across mixed values

输入: [[1,4,2,10,23,3,1,0,20],4]

期望: 39

长度 4 的窗口和为 [1+4+2+10=17, 4+2+10+23=39, 2+10+23+3=38, 10+23+3+1=37, 23+3+1+0=27, 3+1+0+20=24],最大值 39 出现在索引 1..4 的窗口 [4,2,10,23]。

Case 2 · k = 1 → max element of an all-negative array

输入: [[-2,-5,-1,-4],1]

期望: -1

k=1 时每个窗口就是一个元素,答案是 max(nums)。即使全部为负数,公式仍正确返回最大(最不负)的元素 -1。

Case 3 · k = len(nums) → only one window, sum of all

输入: [[3,-1,4,-1,5],5]

期望: 10

k 等于数组长度时只有一个窗口——整个数组,答案是元素总和 3+(-1)+4+(-1)+5 = 10。