最早一段总体方差严格越过冲击阈值的 K 日窗口
Earliest K-Day Window Whose Population Variance Strictly Exceeds A Spike Threshold
开始编码实现 solution(returns: list[float], K: int, var_threshold: float) -> int。给定长度为 N 的逐期收益序列 returns、固定窗口长度 K(当 N >= 1 时 1 <= K <= N)以及非负方差阈值 var_threshold,返回**最小的 0-indexed 起始索引 i**,使得 returns[i .. i+K-1] 的总体方差严格大于 var_threshold;若不存在则返回 -1。平凡情形(含 N == 0、K == 1 且 var_threshold >= 0、returns 全为同一常数且 var_threshold == 0)下也返回 -1。
方差为总体形式(除数为 K):
pop_var(returns[i..i+K-1]) = (sum of returns[j]**2 for j in [i, i+K)) / K
- ((sum of returns[j] for j in [i, i+K)) / K) ** 2
= E[X^2] - (E[X])**2这与除数为 K - 1 的无偏样本方差不同;用错除数会出错,尤其在 K 较小时。
比较是严格大于(>)。总体方差恰好等于 var_threshold 的窗口不算越界。
例
solution([1.0, 1.0, 1.0, 2.0, 0.0, 1.0, 1.0, 1.0], 3, 0.5) 返回 2。六个长度为 3 的窗口的总体方差为:窗口 0 [1.0, 1.0, 1.0] -> 均值 1.0、方差 0.0;窗口 1 [1.0, 1.0, 2.0] -> 均值 4/3、方差 = (1 + 1 + 4)/3 - (4/3)^2 = 6/3 - 16/9 = 2/9 ≈ 0.2222;窗口 2 [1.0, 2.0, 0.0] -> 均值 1.0、方差 = (1 + 4 + 0)/3 - 1.0 = 5/3 - 1 = 2/3 ≈ 0.6667;窗口 3 [2.0, 0.0, 1.0] -> 均值 1.0、方差 = 5/3 - 1 = 2/3 ≈ 0.6667;窗口 4 [0.0, 1.0, 1.0] -> 均值 2/3、方差 = 2/3 - 4/9 = 2/9 ≈ 0.2222;窗口 5 [1.0, 1.0, 1.0] -> 方差 0.0。窗口 0(0.0)与窗口 1(~0.2222)都 <= 0.5,不是严格越界。窗口 2(~0.6667)是首个总体方差严格大于 0.5 的窗口,因此函数返回 2(该窗口的起始索引,对应原始 returns 中那个 1.0 的位置)。
对比:solution([1.0, 1.5, 2.0, 1.8, 1.2], 3, 5.0) 返回 -1。三个长度为 3 的窗口的总体方差约 ~0.1667、~0.0422、~0.1156,都远小于 5.0,故无窗口越界,返回 -1。
实践背景
收益流的运行方监控者希望对短期波动率冲击有一个早期预警探针:给定一个 K 日窗口内方差的冲击阈值(粗粒度的"波动率的波动率"指示),当日 tape 上最早一段长度为 K 的窗口在何处首次让已实现方差越过该上限?答案就是当日某种 regime-shift 监控器首次会触发的位置 —— 比后面(可能更嘈杂)的越界都来得早。返回起始索引而不是右端点或越界窗口列表,是有意为之:下游消费者关心第一次 regime-shift 事件前沿的位置以做诊断对齐,不是事件计数也不是最严重的越界。-1 表示"今天没有越界" —— 安静的回答。本题与"最长稳定窗口"探测器(找的是相反条件,即方差落在容差带内的最长平稳段)和"冲击次数"问题(计数而不定位首次发生)都不同,纯粹是首次触发的定位问题,且采用严格不等比较。
实现细节由 stubs/stub.py 提供。
约束条件
- 0 <= len(returns) <= 5000;每个元素是有限有符号 float,绝对值不超过 1e6
- 1 <= K <= max(1, len(returns));K 为 int,当 len(returns) >= 1 时不会超过 returns 长度
- var_threshold 是有限 float,且 var_threshold >= 0.0
- 方差为**总体方差**(除数为 K:E[X^2] - (E[X])^2),**不是**除数为 K-1 的样本方差
- 比较为**严格大于**(var > var_threshold);相等不触发;输出为最小的 0-indexed 窗口起始索引,若无窗口越界则返回 -1;若 len(returns) == 0 则答案为 -1
样例
Case 1 · statement-example: 8-day tape with K=3 and threshold 0.5 -> earliest breach at start 2
输入: [[1,1,1,2,0,1,1,1],3,0.5]
期望: 2
窗口 0 `[1,1,1]` 方差 0;窗口 1 `[1,1,2]` 方差 2/9≈0.222;窗口 2 `[1,2,0]` 方差 2/3≈0.667 > 0.5。首次严格越界窗口起始索引为 2。
Case 2 · statement-example: 5-day tape K=3 threshold too high -> -1
输入: [[1,1.5,2,1.8,1.2],3,5]
期望: -1
三个长度为 3 的窗口方差均远小于 5.0,无窗口严格越界,返回 -1。
Case 3 · statement-example: K=2 immediate breach at start 0
输入: [[0,3,0,0],2,1]
期望: 0
窗口 0 `[0,3]` 总体方差 = (0 + 9)/2 - (1.5)^2 = 4.5 - 2.25 = 2.25 > 1.0,立刻在起始 0 触发。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: 8-day tape with K=3 and threshold 0.5 -> earliest breach at start 2
输入: [[1,1,1,2,0,1,1,1],3,0.5]
期望: 2
窗口 0 `[1,1,1]` 方差 0;窗口 1 `[1,1,2]` 方差 2/9≈0.222;窗口 2 `[1,2,0]` 方差 2/3≈0.667 > 0.5。首次严格越界窗口起始索引为 2。
Case 2 · statement-example: 5-day tape K=3 threshold too high -> -1
输入: [[1,1.5,2,1.8,1.2],3,5]
期望: -1
三个长度为 3 的窗口方差均远小于 5.0,无窗口严格越界,返回 -1。
Case 3 · statement-example: K=2 immediate breach at start 0
输入: [[0,3,0,0],2,1]
期望: 0
窗口 0 `[0,3]` 总体方差 = (0 + 9)/2 - (1.5)^2 = 4.5 - 2.25 = 2.25 > 1.0,立刻在起始 0 触发。