← 返回编程题库
coding-highest-k-day-range中等免费版2000ms未尝试

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 可见样例;服务端提交会运行可见样例和隐藏测试。

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

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

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)。