← 返回编程题库
coding-subranges-above-return-threshold中等免费版2000ms未尝试

累计收益超阈值的子区间计数

Subranges Above Return Threshold

开始编码

你正在对一只对数收益率序列做信号挖掘:策略组想知道,在历史窗口内, 有多少个连续交易日子区间累计对数收益超过门槛 R。这个数字直接决定 策略的潜在交易频次—— 如果阈值取得太高,几乎没有子区间能命中(信号过稀, 回测样本不足);阈值取得太低,几乎所有子区间都命中(信号没区分度)。 扫一遍各种 R 的命中数,就能为后续的参数选择给出粗粒度直觉。

请实现 solution(returns: list[float], R: float) -> intreturns 是按 时间升序排列的对数收益率序列;R 是收益门槛。返回所有满足 sum(returns[i..j]) >= R 的子区间 (i, j) 对数,其中 0 <= i <= j < n, 即区间长度至少为 1。注意子区间是连续的,不能跳着选;并且 i == j 的单日区间也是合法计数对象。判断使用 1e-9 的绝对容忍:只要 interval_sum >= R - 1e-9 就计入。

例如 solution([0.02, -0.01, 0.03, -0.005, 0.01], 0.02) 应返回 9。 共有 15 个子区间,按起点-终点列出累计收益: (0,0)=0.02 ✓(0,1)=0.01(0,2)=0.04 ✓(0,3)=0.035 ✓(0,4)=0.045 ✓(1,1)=-0.01(1,2)=0.02 ✓(1,3)=0.015(1,4)=0.025 ✓(2,2)=0.03 ✓(2,3)=0.025 ✓(2,4)=0.035 ✓(3,3)=-0.005(3,4)=0.005(4,4)=0.01。打 ✓ 的共 9 个,所以答案是 9。

朴素的三重循环 O(n³) 在 n = 3000 时是 270 亿次操作,明显超时。把序列 预处理成前缀和,再做两重循环把每次区间求和压成一次减法,整体 O(n²) —— 对 n = 3000 大约是 450 万次比较,能在 1 秒内完成。当前框架的参考实现位于 solutions/solution.py,提交时请填写 stubs/stub.py

约束条件

  • 0 ≤ len(returns) ≤ 3000
  • -1.0 ≤ returns[i] ≤ 1.0(对数收益率,可正可负)
  • -1000.0 ≤ R ≤ 1000.0
  • 返回 `int`:满足条件的 `(i, j)` 子区间对数(其中 `0 <= i <= j < n`,区间长度至少为 1)
  • 比较使用浮点容忍:当 `interval_sum >= R - 1e-9` 时视为达标
  • 若 `returns` 为空,返回 0

样例

Case 1 · statement example: 5 returns, R=0.02

输入: [[0.02,-0.01,0.03,-0.005,0.01],0.02]

期望: 9

穷举 15 个子区间,累计收益 >= 0.02 的有 9 个:(0,0)=0.02、(0,2)=0.04、(0,3)=0.035、(0,4)=0.045、(1,2)=0.02、(1,4)=0.025、(2,2)=0.03、(2,3)=0.025、(2,4)=0.035。

Case 2 · exact-threshold boundary: tolerance picks up sums equal to R

输入: [[0.01,0.02,0.03],0.05]

期望: 2

6 个子区间累计收益分别为 0.01、0.02、0.03、0.03、0.05、0.06。其中 >= 0.05 的有两个:(1,2)=0.05 和 (0,2)=0.06。注意 0.05 在 1e-9 容忍下应被计入。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement example: 5 returns, R=0.02

输入: [[0.02,-0.01,0.03,-0.005,0.01],0.02]

期望: 9

穷举 15 个子区间,累计收益 >= 0.02 的有 9 个:(0,0)=0.02、(0,2)=0.04、(0,3)=0.035、(0,4)=0.045、(1,2)=0.02、(1,4)=0.025、(2,2)=0.03、(2,3)=0.025、(2,4)=0.035。

Case 2 · exact-threshold boundary: tolerance picks up sums equal to R

输入: [[0.01,0.02,0.03],0.05]

期望: 2

6 个子区间累计收益分别为 0.01、0.02、0.03、0.03、0.05、0.06。其中 >= 0.05 的有两个:(1,2)=0.05 和 (0,2)=0.06。注意 0.05 在 1e-9 容忍下应被计入。