双单调队列滑窗下的分钟级行情极差监控
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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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,没有完整窗口,返回 []。