← 返回编程题库
coding-stream-kth-largest-pnl简单免费版2000ms未尝试

流式 K 大盈亏

Streaming K-th Largest P&L

开始编码

某做市台对每个策略的 P&L 流跑一层实时告警。每个 tick 系统拿到所有在场策略的最新 P&L,风控想要在每个 tick 都知道——到目前为止流里的第 K 大 P&L 是多少。这个值驱动一个基于排名的告警:只要第 K 大仍高于配置的下限,台子就知道至少还有 K 个策略在打出健康收益。朴素做法每 tick 重排一次前缀是 O(N² log N),长会话下直接崩;教科书做法是容量为 K 的小顶堆

实现 solution(values: list[float], k: int) -> list[float | None]。对每个 i ∈ range(len(values)),把 values[i] 压入数据结构后,若已见观测至少 K 个,向输出 append 当前第 K 大值;否则 append None。返回长度为 N 的列表。

示例solution([4.0, 5.0, 8.0, 2.0], 2) 返回 [None, 4.0, 5.0, 5.0]。tick 0 只见过一个观测(不足 K=2),emit None。tick 1 时 top-2 是 {4.0, 5.0},第 2 大是 4.0。tick 2 来了 8.0;top-2 变为 {5.0, 8.0},第 2 大是 5.0。tick 3 来了 2.0(比堆顶最小 5.0 还小,堆不变),第 2 大仍是 5.0solution([3.0, 1.0, 4.0], 1) 返回 [3.0, 3.0, 4.0]——K=1 退化为滚动最大值。solution([1.0, 2.0], 5) 返回 [None, None]:K 超过流长度,第 K 大永远无定义。

机械操作很小但不变量要稳:堆里放迄今的 top-K,所以堆的最小值heapq 保证就在下标 0 位置)才是第 K 大。新值到达且堆已满时,只有新值打败 heap[0] 才入堆——入堆时直接替换原最小值。每步 O(log K)。前 K 期 emit None;堆一旦装满,第 K 大就永远有定义(堆里的成员只能保持或被更优替换,永远不会回退到不足 K 个)。这就是 LeetCode 703 套上做市场景的外壳——基于排名告警的滚动第 K 大 P&L 流。

约束条件

  • 0 ≤ N ≤ 10000(N = len(values))
  • 1 ≤ K ≤ 1000;允许 K > N(此时全部输出 None)
  • values[i] 为有限浮点盈亏值(不含 NaN/Inf)
  • 返回长度为 N 的列表;第 i 项为 values[0..i](含两端)中的第 K 大值,若已见观测不足 K 个则为 None(即 i < K - 1)
  • 浮点容差 rel_tol=1e-9, abs_tol=1e-12;None 与 None 按位置匹配

样例

Case 1 · classic streaming K-th largest, K=2

输入: [[4,5,8,2],2]

期望: [null,4,5,5]

tick 0 仅一次观测,emit None。tick 1 时 top-2={4.0,5.0},第 2 大=4.0。tick 2 来 8.0,top-2={5.0,8.0},第 2 大=5.0。tick 3 来 2.0 比 heap[0]=5.0 小,堆不变,第 2 大仍为 5.0。

Case 2 · K=1 degenerates to running max

输入: [[3,1,4,1,5,9,2,6],1]

期望: [3,3,4,4,5,9,9,9]

K=1 时堆容量为 1,heap[0] 就是滚动最大值。每个新值若大于当前最大则替换,否则保持。

Case 3 · K equals N exactly — last position is the global min

输入: [[5,3,8,1],4]

期望: [null,null,null,1]

K=N=4,前三个位置堆未装满故 emit None;第 4 个位置堆装满,top-4 即全体,第 4 大就是全局最小 1.0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · classic streaming K-th largest, K=2

输入: [[4,5,8,2],2]

期望: [null,4,5,5]

tick 0 仅一次观测,emit None。tick 1 时 top-2={4.0,5.0},第 2 大=4.0。tick 2 来 8.0,top-2={5.0,8.0},第 2 大=5.0。tick 3 来 2.0 比 heap[0]=5.0 小,堆不变,第 2 大仍为 5.0。

Case 2 · K=1 degenerates to running max

输入: [[3,1,4,1,5,9,2,6],1]

期望: [3,3,4,4,5,9,9,9]

K=1 时堆容量为 1,heap[0] 就是滚动最大值。每个新值若大于当前最大则替换,否则保持。

Case 3 · K equals N exactly — last position is the global min

输入: [[5,3,8,1],4]

期望: [null,null,null,1]

K=N=4,前三个位置堆未装满故 emit None;第 4 个位置堆装满,top-4 即全体,第 4 大就是全局最小 1.0。