距下一个更高 P&L 的天数
Days Until a Better PnL
开始编码某交易员每天记录一笔逐日盯市 P&L daily_pnl(按时间升序的 float 序列,可以为负)。在一段长时间的平盘或亏损之后,他想对每一天问一个简单问题:「我还要等几天才能打出一个严格更高的 P&L?」 这个数本质上是一个连胜/「等多久才能解套」指标——既能用于事后复盘(「这一段回撤持续了 N 天才创新高」),也能驱动风控规则(「若 K 天内没有更优日就上报」)。对于每个下标 i,请返回最小的 k > 0,使得 daily_pnl[i + k] > daily_pnl[i];如果序列里不存在这样的 k,则返回 0。
请实现 solution(daily_pnl: list[float]) -> list[int]。规则:(1)「更高」必须严格大于——等值的一天不会结束等待;(2)若之后没有任何一天严格更高,该位置答案是 0(不是 -1,也不是数组长度);(3)solution([]) == [] 且 solution([x]) == [0]。
示例:solution([73.0, 74.0, 75.0, 71.0, 69.0, 72.0, 76.0, 73.0]) 返回 [1, 1, 4, 2, 1, 1, 0, 0]。第 0 天(73.0)下一天就更高,等 1 天;第 2 天(75.0)要等到第 6 天的 76.0,等 4 天;第 6、7 两天后续都没有更高的 P&L,因此为 0。再看 solution([3.0, 3.0, 3.0, 3.0]) 返回 [0, 0, 0, 0]:因为比较是严格的,等值不算解套。solution([5.0, 4.0, 3.0, 2.0, 1.0]) 返回 [0, 0, 0, 0, 0]——每一天都是「往后看的全局最大」,永远等不到更高,统一记 0。
单纯的向后线性扫描在 n = 10⁵ 的对抗性输入下是 O(n²) 必超时。正解是索引的单调递减栈:j 从左向右扫,只要栈顶那天的 P&L 严格小于 daily_pnl[j],就弹栈并把 j - i 写入答案。每个索引至多入栈、出栈一次,整体摊还 O(n)——这与 LeetCode「Daily Temperatures」以及更一般的「next-greater-element」模板是同一套路。
约束条件
- 0 ≤ len(daily_pnl) ≤ 100000
- -10⁹ ≤ daily_pnl[i] ≤ 10⁹(P&L 可以为负)
- 「更高」必须**严格**:只有 `daily_pnl[j] > daily_pnl[i]` 才算结束等待。等值不算(继续等)。
- 若之后没有任何一天严格更高,该天的答案为 0。
- 空输入返回 `[]`;只有一天的输入返回 `[0]`。
样例
Case 1 · classic mixed sequence
输入: [[73,74,75,71,69,72,76,73]]
期望: [1,1,4,2,1,1,0,0]
第 0 天 73.0,下一个严格更高的 P&L 是第 1 天 74.0,等待 1 天。第 2 天 75.0 要等到第 6 天 76.0,等 4 天。最后两天之后没有更高值,记 0。
Case 2 · strictly increasing — wait one each, last is zero
输入: [[1,2,3,4,5]]
期望: [1,1,1,1,0]
严格递增时,每一天的下一天就严格更高,等待 1 天;最后一天之后没有更高值,记 0。
Case 3 · strictly decreasing — never higher
输入: [[5,4,3,2,1]]
期望: [0,0,0,0,0]
严格递减时,任何一天之后都没有更高的 P&L,全部为 0。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · classic mixed sequence
输入: [[73,74,75,71,69,72,76,73]]
期望: [1,1,4,2,1,1,0,0]
第 0 天 73.0,下一个严格更高的 P&L 是第 1 天 74.0,等待 1 天。第 2 天 75.0 要等到第 6 天 76.0,等 4 天。最后两天之后没有更高值,记 0。
Case 2 · strictly increasing — wait one each, last is zero
输入: [[1,2,3,4,5]]
期望: [1,1,1,1,0]
严格递增时,每一天的下一天就严格更高,等待 1 天;最后一天之后没有更高值,记 0。
Case 3 · strictly decreasing — never higher
输入: [[5,4,3,2,1]]
期望: [0,0,0,0,0]
严格递减时,任何一天之后都没有更高的 P&L,全部为 0。