K 日最大波动区间
Highest K-Day Range
开始编码在做波动率筛选或者突破策略选股时,经常需要回答这样的问题:在过去这段日 K 数据里, 连续 K 天的最大振幅是多少?这里的振幅指 K 天合成出的“大 K 线”的高低差—— 也就是这 K 天最高价的极大值减去这 K 天最低价的极小值。
实现 solution(highs: list[float], lows: list[float], K: int) -> float。
两个数组同长,同一索引 i 表示第 i 天的最高价和最低价。
对每一个长度恰好为 K 的连续窗口 [i, i+K-1],计算
max(highs[i..i+K-1]) - min(lows[i..i+K-1]),返回所有窗口里的最大值。
若 K > len(highs) 或数组为空,返回 0.0。
例如 solution([10, 12, 11, 18, 17, 14], [9, 10, 8, 15, 13, 11], 3) 应返回 10.0:
- 窗口
[0..2]:highs 取 max=12,lows 取 min=8,振幅 4。 - 窗口
[1..3]:highs 取 max=18,lows 取 min=8,振幅 10。 - 窗口
[2..4]:highs 取 max=18,lows 取 min=8,振幅 10。 - 窗口
[3..5]:highs 取 max=18,lows 取 min=11,振幅 7。
最大振幅出现在中间两个窗口,都是 10.0。
朴素的 O(n·K) 双层循环对小输入足够,但当 n 接近 10⁵、K 也有几百时就会
明显变慢。请考虑用两条单调双端队列——一条维护窗口最大、一条维护窗口最小——
把整体复杂度压到 O(n)。
约束条件
- 0 ≤ len(highs) == len(lows) ≤ 100000
- 1 ≤ K ≤ 100000
- 0 < lows[i] ≤ highs[i] ≤ 10⁶(每根日 K 的最高价不低于最低价)
- 若 K > len(highs),凑不出一个完整窗口,返回 0.0
- 若 highs 为空,返回 0.0
- 返回值是浮点数,允许 1e-6 的相对误差
样例
Case 1 · example from statement K=3
输入: [[10,12,11,18,17,14],[9,10,8,15,13,11],3]
期望: 10
四个长度为 3 的窗口的振幅依次是 4、10、10、7。窗口 [1..3] 与 [2..4] 都同时罩住了第 3 天的低点 8 与第 4 天的高点 18,所以最大振幅是 10.0。
Case 2 · K=1 picks the widest single day
输入: [[10,12,11,18,17,14],[9,10,8,15,13,11],1]
期望: 4
K=1 时每个窗口就是单独一天,振幅就是 highs[i] - lows[i]。逐日振幅 [1, 2, 3, 3, 4, 3] 中最大的是第 5 天的 4.0(17 - 13)。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · example from statement K=3
输入: [[10,12,11,18,17,14],[9,10,8,15,13,11],3]
期望: 10
四个长度为 3 的窗口的振幅依次是 4、10、10、7。窗口 [1..3] 与 [2..4] 都同时罩住了第 3 天的低点 8 与第 4 天的高点 18,所以最大振幅是 10.0。
Case 2 · K=1 picks the widest single day
输入: [[10,12,11,18,17,14],[9,10,8,15,13,11],1]
期望: 4
K=1 时每个窗口就是单独一天,振幅就是 highs[i] - lows[i]。逐日振幅 [1, 2, 3, 3, 4, 3] 中最大的是第 5 天的 4.0(17 - 13)。