跟踪最高水位 span:每个 tick 的连续不超过当前价的回看长度
Trailing High-Watermark Span: Per-Tick Consolidation Length on a Synthetic Tape
开始编码实现 solution(prices: list[float]) -> list[int]。给定一段长度为 N 的合成 tape prices,对每个下标 i(0 <= i < N)返回一个整数 span[i]:满足 prices[i-k+1], prices[i-k+2], ..., prices[i] 全部 小于等于 prices[i] 的最大整数 k。等价地,span[i] = i - j,其中 j 是最大的、满足 prices[j] > prices[i] 的下标 j(若不存在则 j = -1)。
例:solution([1.0, 1.5, 1.5, 1.2, 2.0]) 返回 [1, 2, 3, 1, 5]。第 0 个 tick 自身就是 span 1;第 1 个 tick 1.5 大于 1.0,吸收前一个,span 为 2;第 2 个 tick 1.5 等于 1.5(仍 ≤),继续吸收,span 为 3;第 3 个 tick 1.2 小于 1.5,前一个 1.5 严格更大,span 重置为 1;第 4 个 tick 2.0 严格大于此前所有价格,span 为 5。
需要明确的细节:空输入返回空列表;长度为 1 时输出 [1];相等价格按"小于等于"语义继续 span,不打断;输出列表按位置 精确 比较(整数比较,不带浮点容差)。
朴素方案对每个 i 向左线性回溯,最坏情况下(如递减序列上突然出现的一个新高)退化为 O(N^2),会在 N 接近上限的隐藏用例上超时;标准做法是单调栈维护 (price, span) 对,在每个 tick 上把栈顶不严格大于 prices[i] 的元素出栈并把它们的 span 累加进当前 span,使整体复杂度均摊 O(N)。
实现细节由 stubs/stub.py 提供。
实践背景
桌面侧的 tick 监控模块需要对每条合成价 tape 实时维护一个"跟踪最高水位"指标——回看连续多少个 tick(含当前)一直处在不高于当前 print 的水位上。这个 span 本身就被研究侧用作一个轻量的"盘整长度/突破强度"复合诊断:当 span 由长突然回落到 1(且非首 tick),意味着上方刚出现一个严格更高的 print——也就是一个潜在的突破时刻;当 span 在大量 tick 上持续单调累加,则是连续盘整(高位横盘或缓涨)的迹象;在 N 足够大的合成 tape 上,整段 span 序列还会被下游模块按"近端 span 中位数 / 终值 span"这样的派生统计聚合成更高层的特征。直接对每个 tick 回溯查看会让监控线程跟不上 tape 速率,工程上必须把单步成本压成均摊 O(1)。等号语义(相等价格继续 span)是有意为之:合成 tape 上重复 print 表示"水位被复制保留",没有出现新高,按盘整逻辑就该让 span 继续累加,而不是被自身的复印件打断;这一处理也让重复 print 不会污染下游的"span 重置即突破"判定——只有真正出现严格更高的价时,span 才会被重置为 1。
约束条件
- 0 <= N <= 200000,其中 N 为 solution(prices) 的输入长度
- 每个 prices[i] 为 -1e9 到 1e9 之间的浮点数
- 输出为长度为 N 的 list[int],第 i 项即为下标 i 对应的 trailing span
- 相等价格继续 span(采用"小于等于"语义),不打断
- 输出按位置精确比对(exact 比较),不允许浮点容差
样例
Case 1 · statement-example: span resets at 1.2 then full sweep at 2.0
输入: [[1,1.5,1.5,1.2,2]]
期望: [1,2,3,1,5]
第 0 个 tick 自身 span 1;1.5 吸收 1.0 得 2;1.5 等于 1.5 继续吸收得 3;1.2 < 1.5 重置为 1;2.0 严格大于此前所有,吸收全部得 5。
Case 2 · visible: strictly decreasing prints keep span at 1
输入: [[5,4,3,2,1]]
期望: [1,1,1,1,1]
每个新 tick 都比前一个严格小,永远撞不上一个 ≤ 当前价的栈顶,因此每位 span 都为 1。
Case 3 · visible: equal prices continue span under <=
输入: [[2,2,2,2]]
期望: [1,2,3,4]
所有 tick 价格相同,按 <= 语义每个 tick 都吸收前面全部,span 为 [1, 2, 3, 4]。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: span resets at 1.2 then full sweep at 2.0
输入: [[1,1.5,1.5,1.2,2]]
期望: [1,2,3,1,5]
第 0 个 tick 自身 span 1;1.5 吸收 1.0 得 2;1.5 等于 1.5 继续吸收得 3;1.2 < 1.5 重置为 1;2.0 严格大于此前所有,吸收全部得 5。
Case 2 · visible: strictly decreasing prints keep span at 1
输入: [[5,4,3,2,1]]
期望: [1,1,1,1,1]
每个新 tick 都比前一个严格小,永远撞不上一个 ≤ 当前价的栈顶,因此每位 span 都为 1。
Case 3 · visible: equal prices continue span under <=
输入: [[2,2,2,2]]
期望: [1,2,3,4]
所有 tick 价格相同,按 <= 语义每个 tick 都吸收前面全部,span 为 [1, 2, 3, 4]。