定长滑动窗口最大和
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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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。