← 返回编程题库
coding-longest-low-volume-window中等免费版2000ms未尝试

给定冲击预算下成交量序列的最长合规连续窗口

Longest Contiguous Window of Volumes Within an Impact Budget

开始编码

实现 solution(volumes: list[float], cap: float) -> int。给定逐期非负成交量序列 volumes 与闭区间冲击预算上界 cap,返回 **volumes 中总和不超过 cap 的最长连续子段长度**。注意,长度为 1 的窗口 volumes[i] 自身和即为 volumes[i],因此单根超过 cap 的 bar 不能属于任何合规窗口。

例:solution([120.0, 95.0, 80.0, 250.0, 70.0, 60.0, 50.0, 65.0, 55.0], 200.0) 返回 3。下标 3 处的 250 单根已超过阈值,任何跨越它的窗口都不合规。其右侧的 [70, 60, 50, 65, 55] 中,三个长度为 3 的窗口和分别为 180、175、170,均在阈值内;而长度为 4 的窗口和已超出阈值。最长合规段长度为 3。

空输入、对任意正成交量施以 cap == 0,或所有 bar 均超过 cap,结果均为 0。参考实现目标为 O(N) 时间 / O(1) 空间——双指针配单一累加器一次扫描即可。

函数骨架见 stubs/stub.py

实践背景

执行台运行 VWAP / TWAP 等定时切片算法时,会持续监控市场冲击预算——即在场内累计成交量超过某一阈值之前可继续推送的最大量;超出阈值会触发场所的限流规则、引来掠食单流,或冲撞机构内部的参与率上限。把实盘成交按分钟切成成交量 bar 后,一项常见的监控问题是"我们的累计切片连续保持在预算之内的最长持续段有多长"——即总和未超过冲击预算上界的最长连续窗口。该最长合规段被回报给上层算法作为市态指标:若该段短,则建议收缩调度计划;若该段长,则算法可继续按既定节奏运行。函数在分钟级实盘上必须维持 O(N)

约束条件

  • 0 <= len(volumes) <= 5000;每个元素为有限非负浮点数,取值最高可达 1e12 以容纳对抗性冲击峰值
  • cap 为有限非负浮点数;cap == 0 时仅长度为 1 的零成交量窗口(以及更长的全零段)合规
  • 阈值边界为闭——窗口总和恰好等于 `cap` 仍计入合规
  • 若每个 `volumes[i]` 均超过 `cap`,则无任何合规窗口,答案为 0;空输入同样返回 0
  • 输出为整数长度,使用精确比对(不引入浮点容差)

样例

Case 1 · statement-example: mid-stream spike splits the run

输入: [[120,95,80,250,70,60,50,65,55],200]

期望: 3

在阈值 cap=200 下,最佳窗口起点必须落在大值 250 之后。从下标 4 开始的 [70, 60, 50] 累计 180,再加入 65 变成 245 超出阈值,需收缩左端;最终最长合规窗口为 [70, 60, 50] 与 [60, 50, 65] 与 [50, 65, 55] 三段长度均为 3 的连续区段,故答案为 3。

Case 2 · statement-example: single observation exceeds cap, run is split

输入: [[10,20,500,30,40],90]

期望: 2

中间的 500 单独已经超出 cap=90,任何包含该位置的窗口都不合规。左侧 [10, 20] 累计 30 合规但右扩到 500 立即超限;右侧 [30, 40] 累计 70 合规。最长合规连续段长度为 2。

Case 3 · statement-example: entire stream fits under cap

输入: [[5,5,5,5,5],100]

期望: 5

总和 25 远小于 cap=100,整个序列即合规窗口,长度为 5。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: mid-stream spike splits the run

输入: [[120,95,80,250,70,60,50,65,55],200]

期望: 3

在阈值 cap=200 下,最佳窗口起点必须落在大值 250 之后。从下标 4 开始的 [70, 60, 50] 累计 180,再加入 65 变成 245 超出阈值,需收缩左端;最终最长合规窗口为 [70, 60, 50] 与 [60, 50, 65] 与 [50, 65, 55] 三段长度均为 3 的连续区段,故答案为 3。

Case 2 · statement-example: single observation exceeds cap, run is split

输入: [[10,20,500,30,40],90]

期望: 2

中间的 500 单独已经超出 cap=90,任何包含该位置的窗口都不合规。左侧 [10, 20] 累计 30 合规但右扩到 500 立即超限;右侧 [30, 40] 累计 70 合规。最长合规连续段长度为 2。

Case 3 · statement-example: entire stream fits under cap

输入: [[5,5,5,5,5],100]

期望: 5

总和 25 远小于 cap=100,整个序列即合规窗口,长度为 5。