← 返回编程题库
coding-find-pivot-index简单免费版2000ms未尝试

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 = 28i = 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 可见样例;服务端提交会运行可见样例和隐藏测试。

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

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

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。