← 返回编程题库
coding-peak-inventory-day-after-batch-trades简单免费版2000ms未尝试

批量区间增量交易后的峰值库存日

Peak Inventory Day After Batched Range-Update Trades

开始编码

实现 solution(N: int, trades: list[list[int]]) -> int。共 N 个交易日,下标为 0..N-1,每日库存初始为 0trades 中每个三元组 [l, r, delta] 表示"将整数 delta 累加到闭区间 [l, r]每一天的库存上"。多笔交易的窗口可以重叠;某天 d 的最终库存为所有覆盖到 ddelta 之和。施加全部交易后,返回最终库存最大的日下标 0..N-1;若多个日并列最大,返回最小的那个。

示例:solution(5, [[0, 2, 3], [1, 4, 2], [2, 3, -1]]) 返回 1。逐日推演:日 0 仅被第一笔覆盖(+3),日 1 同时被第一笔和第二笔覆盖(+3 + 2 = 5),日 2 被三笔都覆盖(+3 + 2 - 1 = 4),日 3 被第二、第三笔覆盖(+2 - 1 = 1),日 4 只被第二笔覆盖(+2)。最终库存 [3, 5, 4, 1, 2]——峰值 5 出现在日 1

边界情形必须严格处理:solution(3, []) 返回 0,因为空 trades 让所有日库存均为 0,最小下标 tie-break 即返回日 0solution(1, [[0, 0, 5]]) 返回 0(唯一的日)。即使所有日的最终库存都为负,也仍需返回 [0, N-1] 范围内的某个合法日——负值中的"最大"就是"最不那么负"那一日。当多个日并列峰值(例如单笔交易覆盖整个区间,使整段平台齐高),返回这一并列集合中最小的日下标,而不是最大的。

O(N * Q) 的写法(每笔交易都遍历 [l, r]、在每个被覆盖的日上累加 delta)在当前约束下未必超时,但测试集会用一系列正确性陷阱挤压实现:r + 1 抵消写入处的 off-by-one、把差分数组分配成长度 N 而非 N + 1、argmax 用 >= 而非严格 >(这会把 tie-break 翻成"返回最大下标")、或者返回的是峰值数值而不是下——隐藏用例都会捕到。预期解法即标准差分数组:开 diff 长度 N + 1,每笔交易 O(1) 写入 diff[l] += deltadiff[r + 1] -= delta,随后按 d = 0..N-1 扫描累加 cum += diff[d] 并维护 (best_inv, best_day),仅在 cum > best_inv 严格成立时更新最佳。

实现细节由 stubs/stub.py 提供。

实践背景

某交易台的每日库存账本会在隔夜批处理中收到一批"合成交易":每条记录形如"在日期区间 [l, r] 上把带符号的 delta 累加进我的运行库存"——例如"为模拟即将公告的公司行动敞口,从日 5 到日 12 把毛敞口提高 1000 单位",或"为对冲簿其它处已记账的头寸,把日 0 到日 30 的库存反向减去 200"。把全部条目应用到库存时序之后,运营团队需要知道哪一天的库存敞口达到峰值,以便提前预算保证金与仓储容量、检查头寸限额余量,并把最坏一日上报给资金部门。最小下标 tie-break 是确定性报表的硬要求:当多日同享峰值(公司行动型"矩形"敞口经常出现这种平台),报表必须始终返回最早的并列日,从而保证下游告警与对账日志在同一批输入的不同重跑下逐字节一致。生产里有两个合约细节最容易踩坑。第一,差分数组的 r + 1 槽位在 r == N - 1 时落在日下标范围之外,因此 diff 缓冲必须分配长度 N + 1,尽管最终只需要报告 N 天——分配成 N 要么在边界交易上崩溃,要么静默丢掉抵消写入并污染之后所有重建。第二,"最小下标 tie-break"对应 argmax 扫描里的严格大于、而非大于等于:一个错位的 >= 会悄悄返回最大并列日下标,让同批输入在重跑时报表内容不再一致。

约束条件

  • 1 <= N <= 5000,其中 N 为交易日数(日下标 0..N-1)
  • 0 <= len(trades) <= 5000;每笔 trade 是三元素列表 [l, r, delta]
  • 0 <= l <= r < N([l, r] 区间非空且整体落在 [0, N-1] 之内)
  • -1000000 <= delta <= 1000000(带符号整数);trades 为空时返回 0
  • 输出为 [0, N-1] 内的单个 int 日下标;峰值平局时返回**最小**下标

样例

Case 1 · statement-example: peak at day 1 with overlap

输入: [5,[[0,2,3],[1,4,2],[2,3,-1]]]

期望: 1

逐日库存 [3,5,4,1,2];峰值 5 出现在日 1。

Case 2 · visible: empty trades returns day 0

输入: [3,[]]

期望: 0

trades 为空,所有日库存均为 0,最小下标 tie-break 返回 0。

Case 3 · visible: full-range single trade ties all days at peak

输入: [5,[[0,4,7]]]

期望: 0

单笔覆盖全区间,全日均为 7;并列峰值返回最小下标 0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: peak at day 1 with overlap

输入: [5,[[0,2,3],[1,4,2],[2,3,-1]]]

期望: 1

逐日库存 [3,5,4,1,2];峰值 5 出现在日 1。

Case 2 · visible: empty trades returns day 0

输入: [3,[]]

期望: 0

trades 为空,所有日库存均为 0,最小下标 tie-break 返回 0。

Case 3 · visible: full-range single trade ties all days at peak

输入: [5,[[0,4,7]]]

期望: 0

单笔覆盖全区间,全日均为 7;并列峰值返回最小下标 0。