P&L 序列的枢轴下标
Find the Pivot Index of a P&L Stream
开始编码风控归因流水线正在回放某策略当日的逐笔 P&L。策略组想找出当日累计 P&L 的平衡点:最早的那个 tick i,使得严格在 i 之前记账的部分之和,等于严格在 i 之后记账的部分之和。这个 tick 就是「上午盈亏与下午盈亏正好抵消」的那一刻——既能作为日内分段归因的锚点,也能用来验证自定义切分是否与桌面的累计口径一致。
请实现 solution(nums: list[int]) -> int。返回最小的下标 i,使得 sum(nums[:i]) == sum(nums[i+1:])。若不存在这样的下标,返回 -1。下标 i 本身不计入两侧之和。边界情形:空数组返回 -1(没有下标可返回);单元素数组返回 0(两侧都是空,和都是 0);全零数组同样返回 0。
示例:solution([1, 7, 3, 6, 5, 6]) 返回 3。左侧 [1, 7, 3] 和为 11,右侧 [5, 6] 和为 11,下标 3 处的枢轴值 6 不计入任何一侧。更小的下标都不行:i = 0 时左侧空(和 0),右侧 1+7+3+6+5+6 = 28;i = 2 时左侧 1+7=8,右侧 6+5+6=17,都不等。无解示例:solution([1, 2, 3]) 返回 -1——任何下标都无法让两侧相等。空数组示例:solution([]) 返回 -1(没有下标可返回)。
朴素的 O(n^2) 双重扫描每次都重算两侧之和,n = 10^4 时已逼近 TLE 边界。经典做法是前缀和:先一次性算出 total = sum(nums),扫描时只维护累计的 left_sum,右侧之和直接用 total - left_sum - nums[i] 在 O(1) 时间得出。整体 O(n) 时间、O(1) 额外空间。一旦 left_sum == total - left_sum - nums[i] 成立,立即返回当前 i——最左优先写在合约里,找到第一个就停。
约束条件
- 0 ≤ len(nums) ≤ 10000
- -10000 ≤ nums[i] ≤ 10000
- 返回最小(最左)满足左侧和等于右侧和的下标 i;若不存在,返回 -1
- 空数组返回 -1;长度为 1 的数组返回 0
- 结果为精确整数,不存在浮点容差
样例
Case 1 · classic LC pivot — left of 6 sums to 11, right of 6 sums to 11
输入: [[1,7,3,6,5,6]]
期望: 3
left=[1,7,3] 和为 11,right=[5,6] 和为 11,下标 3 的枢轴值 6 不计入两侧。更小的下标都不平衡。
Case 2 · no pivot — strictly increasing
输入: [[1,2,3]]
期望: -1
三个下标分别给出 (0,5)、(1,3)、(3,0),没有一个左右相等,返回 -1。
Case 3 · empty list — no index to return
输入: [[]]
期望: -1
空数组没有下标可返回,按合约返回 -1。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · classic LC pivot — left of 6 sums to 11, right of 6 sums to 11
输入: [[1,7,3,6,5,6]]
期望: 3
left=[1,7,3] 和为 11,right=[5,6] 和为 11,下标 3 的枢轴值 6 不计入两侧。更小的下标都不平衡。
Case 2 · no pivot — strictly increasing
输入: [[1,2,3]]
期望: -1
三个下标分别给出 (0,5)、(1,3)、(3,0),没有一个左右相等,返回 -1。
Case 3 · empty list — no index to return
输入: [[]]
期望: -1
空数组没有下标可返回,按合约返回 -1。