最接近目标名义本金的成交配对
Closest Trade Pair to Target Notional
开始编码做基差套利或大宗交易撮合时,我们常常需要把账上若干笔已成交的小单两两组合,找出配对名义本金最接近某个目标值的那一对。比如做市台想要为一笔大额客户委托寻找两笔现成的对冲腿,使两条腿合计名义本金尽量贴近这个目标——剩余的不平衡再用更精细的工具去对冲。
请实现 solution(trades: list[list[float]], target: float) -> float。trades 是一组成交记录,每条记录形如 [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.0 与 target=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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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,是严格最优解。