← 返回编程题库
coding-closest-trade-pair-notional中等免费版2000ms未尝试

最接近目标名义本金的成交配对

Closest Trade Pair to Target Notional

开始编码

做基差套利或大宗交易撮合时,我们常常需要把账上若干笔已成交的小单两两组合,找出配对名义本金最接近某个目标值的那一对。比如做市台想要为一笔大额客户委托寻找两笔现成的对冲腿,使两条腿合计名义本金尽量贴近这个目标——剩余的不平衡再用更精细的工具去对冲。

请实现 solution(trades: list[list[float]], target: float) -> floattrades 是一组成交记录,每条记录形如 [price, quantity],对应单笔成交的名义本金 price * quantity。整个列表已经按名义本金升序排好(这是数据清洗阶段的常见输入形态)。请从中选两笔不同的成交,使它们的名义本金之和与 target 的绝对距离最小,返回这个最近的和(浮点数)。如果存在多对距离相同的组合,返回其中任意一对的和都可以——它们的数值本身相同。

例如 solution([[1.0, 1.0], [2.0, 1.0], [3.0, 1.0], [10.0, 1.0]], 7.0) 应返回 5.0。四条成交的名义本金分别是 1、2、3、10;任意两笔不同成交的和有 1+2=3、1+3=4、1+10=11、2+3=5、2+10=12、3+10=13。其中 5.0target=7.0 的距离是 2,比其它任何组合(最接近的另外几个是 4 和 11,距离分别为 3 和 4)都更近,所以答案是 5.0

由于 trades 长度可达 20 万,朴素的 O(n²) 双重循环会超时。请使用单调地从两端收缩的双指针扫描,把整体复杂度压到 O(n)(不计排序,因为输入已排好)。

约束条件

  • 2 ≤ len(trades) ≤ 200000
  • trades[k] = [price, quantity],price 和 quantity 都是正实数(price ≤ 1e6,quantity ≤ 1e6)
  • trades 已按 `price * quantity`(即名义本金)**升序排列**;不同成交允许名义本金并列
  • -1e12 ≤ target ≤ 1e12
  • 返回值是一个浮点数:最接近 target 的两笔成交名义本金之和;允许 1e-6 相对误差

样例

Case 1 · example from statement

输入: [[[1,1],[2,1],[3,1],[10,1]],7]

期望: 5

四笔成交的名义本金分别是 1、2、3、10。所有不同两笔之和有 3、4、11、5、12、13;与 target=7.0 的距离依次是 4、3、4、2、5、6。最小距离 2 对应的和是 5.0。

Case 2 · target is exactly achievable

输入: [[[2,5],[3,5],[4,5]],30]

期望: 30

三笔成交名义本金分别是 10、15、20,pair sums 为 25、30、35。其中 30 与 target=30.0 完全相等,距离为 0,是严格最优解。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · example from statement

输入: [[[1,1],[2,1],[3,1],[10,1]],7]

期望: 5

四笔成交的名义本金分别是 1、2、3、10。所有不同两笔之和有 3、4、11、5、12、13;与 target=7.0 的距离依次是 4、3、4、2、5、6。最小距离 2 对应的和是 5.0。

Case 2 · target is exactly achievable

输入: [[[2,5],[3,5],[4,5]],30]

期望: 30

三笔成交名义本金分别是 10、15、20,pair sums 为 25、30、35。其中 30 与 target=30.0 完全相等,距离为 0,是严格最优解。