← 返回编程题库
coding-rolling-window-range-spread中等免费版2000ms未尝试

双单调队列滑窗下的分钟级行情极差监控

Minute-Bar Range Monitor via Dual-Deque Sliding Max-Minus-Min

开始编码

实现 solution(prices: list[float], window: int) -> list[float]。给定价格序列 prices 与固定窗口长度 window,返回逐窗口的极差列表——即对每段长度为 window 的连续子段,计算其最大值减最小值,按从左到右的顺序排列。输出长度为 len(prices) - window + 1,每个元素均为非负数。

window > len(prices)window < 1,则不存在完整窗口,返回空列表。

solution([100.0, 101.5, 99.8, 102.2, 100.6, 98.4, 103.1, 101.0], 3) 返回 [1.7, 2.4, 2.4, 3.8, 4.7, 4.7](六个长度为 3 的窗口;例如第一个窗口 [100.0, 101.5, 99.8] 最大 101.5、最小 99.8,极差 1.7;第四个窗口 [102.2, 100.6, 98.4] 极差 102.2 - 98.4 = 3.8)。

恒定序列产生长度为 (N - W + 1) 的全零列表。

函数骨架见 stubs/stub.py

实践背景

执行台常用"分钟级行情极差监控",即在滚动窗口内跟踪近期 bar 的最高减最低作为一个廉价的波动率代理量。相比滚动样本标准差,它无需平方项运算,对整数 tick 价位格点保持精确可表,因此天然适合做第一道区间过滤,在更昂贵的 sigma 估计器启用之前先把市态看一眼。要在分钟频实盘上常驻运行,实现必须维持 O(N);双单调队列模式(分别维护极大与极小两个单调队列)是教科书上把两端极值各自维持在分摊常数时间的标准做法。

约束条件

  • 0 <= len(prices) <= 5000;每个元素为有限浮点数,绝对值不超过 1e6
  • window 为整数;若 window < 1 或 window > len(prices),返回 [] (此条同时覆盖 prices 为空的情形)
  • 输出为长度 max(0, len(prices) - window + 1) 的列表;每个元素等于对应的长度为 window 的连续切片的 max 减 min,故均为非负数
  • 比对器为 float,rel_tol 1e-9、abs_tol 1e-12——容忍减法带来的微小舍入误差,但算法层面必须给出每个窗口集合意义下精确的 max 减 min
  • 窗口内出现并列最大或并列最小(多个下标取到极值)时不得产生乱序或重复输出;第 i 个输出对应切片 ``prices[i : i + window]``

样例

Case 1 · statement-example: minute-bar range over 8 prices, window=3

输入: [[100,101.5,99.8,102.2,100.6,98.4,103.1,101],3]

期望: [1.7000000000000028,2.4000000000000057,2.4000000000000057,3.799999999999997,4.699999999999989,4.699999999999989]

八个价格、窗口为 3,共有 6 个长度为 3 的子段,依次极差为 101.5-99.8=1.7、102.2-99.8=2.4、102.2-99.8=2.4、102.2-98.4=3.8、103.1-98.4=4.7、103.1-98.4=4.7。

Case 2 · statement-example: constant series gives zero ranges

输入: [[5,5,5,5,5],4]

期望: [0,0]

五个等值的价格、窗口为 4,得到 2 个长度为 4 的子段,每段 max=min=5.0,极差均为 0。

Case 3 · statement-example: window exceeds length, return empty list

输入: [[1,2,3],5]

期望: []

窗口长度 5 大于序列长度 3,没有完整窗口,返回 []。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: minute-bar range over 8 prices, window=3

输入: [[100,101.5,99.8,102.2,100.6,98.4,103.1,101],3]

期望: [1.7000000000000028,2.4000000000000057,2.4000000000000057,3.799999999999997,4.699999999999989,4.699999999999989]

八个价格、窗口为 3,共有 6 个长度为 3 的子段,依次极差为 101.5-99.8=1.7、102.2-99.8=2.4、102.2-99.8=2.4、102.2-98.4=3.8、103.1-98.4=4.7、103.1-98.4=4.7。

Case 2 · statement-example: constant series gives zero ranges

输入: [[5,5,5,5,5],4]

期望: [0,0]

五个等值的价格、窗口为 4,得到 2 个长度为 4 的子段,每段 max=min=5.0,极差均为 0。

Case 3 · statement-example: window exceeds length, return empty list

输入: [[1,2,3],5]

期望: []

窗口长度 5 大于序列长度 3,没有完整窗口,返回 []。