← 返回编程题库
coding-sliding-window-max-quote中等免费版2000ms未尝试

报价滑动窗口最大值

Sliding Window Max of Quotes

开始编码

实时波动扫描器盯着某只标的中间价的 tick 流,要在某个窗口内出现「局部高点显著偏离局部均值」时触发预警——这是方向性 spike 的早期信号。扫描器从每个滚动窗口里需要的最便宜的统计量就是窗口内的最大报价。给定按时间升序的整数报价序列 quotes 和固定窗口长度 window,请返回窗口从左到右每滑动一步对应的逐窗口最大值列表。

请实现 solution(quotes: list[int], window: int) -> list[int]。输出长度为 N - window + 1,其中 N = len(quotes),第 k 个输出(0 索引)等于 max(quotes[k : k + window])。若 window > len(quotes)window <= 0,抛 ValueError——这些输入违反规范。

示例solution([1, 3, -1, -3, 5, 3, 6, 7], 3) 返回 [3, 3, 5, 5, 6, 7](LeetCode 239 的标志性样例)。solution([5, 2, 8, 4, 1, 9, 3], 1) 返回 [5, 2, 8, 4, 1, 9, 3]——当 window == 1 时每个窗口只含一个元素,输出与输入相同。solution([3, 1, 4, 1, 5, 9, 2, 6], 8) 返回 [9]——当 window == N 时只有一个窗口覆盖整个数组,输出是全局最大值。

朴素的 O(N·W) 做法(每步重新算 max)在 N = 10⁵W = 10⁴ 时会爆预算。标准的 O(N) 技巧是单调递减的索引双端队列:每个元素至多入队一次、出队一次。每步:(1) 当队尾对应的值 <= 新进入的报价时从尾部弹出(这些旧索引再也不可能当最大值了,新值压制它们且活得更久);(2) 把新索引压入;(3) 当队首已经滑出窗口 [i - window + 1, i]从头部弹出;(4) 当 i >= window - 1 时,把 quotes[dq[0]] 作为当前窗口最大值追加到输出。由于每个索引恰好入队、出队各一次,摊还总工作量是 O(N)。

实际背景:这正是微观结构里 rolling-max 指标的扫描核心——波动率曲面监控、跳空检测告警、止损猎杀启发式都拿它当特征输入。生产扫描器经常对一整本订单簿并行跑成千上万份这样的扫描,所以 O(N·W) 基线根本不够用,单调队列才是教科书答案。

约束条件

  • 0 ≤ len(quotes) ≤ 100000
  • 1 ≤ window ≤ len(quotes)
  • quotes[i] 是整数(允许负数、零、正数)
  • 输出长度必须等于 len(quotes) - window + 1
  • 若 window > len(quotes) 或 window <= 0,抛 ValueError

样例

Case 1 · leetcode classic — window 3 over mixed sequence

输入: [[1,3,-1,-3,5,3,6,7],3]

期望: [3,3,5,5,6,7]

窗口大小 3。窗口 [1,3,-1] max=3;[3,-1,-3] max=3;[-1,-3,5] max=5;[-3,5,3] max=5;[5,3,6] max=6;[3,6,7] max=7。这是 LeetCode 239 的经典样例,单调递减队列在每一步都把被新值「淘汰」的旧索引从尾部弹出,并在窗口越界时从头部弹出。

Case 2 · window=1 — output equals input

输入: [[5,2,8,4,1,9,3],1]

期望: [5,2,8,4,1,9,3]

窗口大小 1 时每个窗口只含一个元素,输出就是原序列。这条样例验证 i - window 的越界判断(窗口=1 时 dq[0] <= i-1 必须立即把上一个索引弹掉)。

Case 3 · window=N — single window over entire array

输入: [[3,1,4,1,5,9,2,6],8]

期望: [9]

窗口等于数组长度,只有唯一一个窗口,结果是全局最大值。输出长度 = N - W + 1 = 1。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · leetcode classic — window 3 over mixed sequence

输入: [[1,3,-1,-3,5,3,6,7],3]

期望: [3,3,5,5,6,7]

窗口大小 3。窗口 [1,3,-1] max=3;[3,-1,-3] max=3;[-1,-3,5] max=5;[-3,5,3] max=5;[5,3,6] max=6;[3,6,7] max=7。这是 LeetCode 239 的经典样例,单调递减队列在每一步都把被新值「淘汰」的旧索引从尾部弹出,并在窗口越界时从头部弹出。

Case 2 · window=1 — output equals input

输入: [[5,2,8,4,1,9,3],1]

期望: [5,2,8,4,1,9,3]

窗口大小 1 时每个窗口只含一个元素,输出就是原序列。这条样例验证 i - window 的越界判断(窗口=1 时 dq[0] <= i-1 必须立即把上一个索引弹掉)。

Case 3 · window=N — single window over entire array

输入: [[3,1,4,1,5,9,2,6],8]

期望: [9]

窗口等于数组长度,只有唯一一个窗口,结果是全局最大值。输出长度 = N - W + 1 = 1。