LeetCode数组中心索引解法超时,求优化方案
问题描述
给定整数数组nums,计算其中心索引(pivot index)。中心索引是指该索引左侧所有元素的和等于右侧所有元素的和的位置。若索引在数组左边缘,左侧和为0;右边缘同理。返回最左侧的中心索引,若无则返回-1。
示例
- 示例1:输入nums = [1,7,3,6,5,6],输出3
- 示例2:输入nums = [1,2,3],输出-1
- 示例3:输入nums = [2,1,-1],输出0
遇到的问题
我写出的解法可正常运行,但超出LeetCode时间限制,已通过740/745个测试用例,代码如下:
class Solution: def pivotIndex(self, nums: List[int]) -> int: left_list = [] for index,num in enumerate(nums): if sum(nums[index+1:]) == sum(left_list): return index else: left_list.append(num) return -1
请问如何进一步优化这段代码?
优化方案
你的代码超时的核心原因是每次循环都调用sum()计算左右和,这会导致时间复杂度达到O(n²)——每次切片求和都要遍历子数组,当数组规模较大时效率极低。
可以通过预计算总和+动态维护左侧和的方式优化,将时间复杂度降到O(n):
优化思路
- 先计算数组的总和total;
- 初始化左侧和left_sum为0;
- 遍历数组时,当前索引的右侧和 = total - left_sum - 当前元素;
- 对比left_sum和右侧和,相等则返回当前索引;否则把当前元素加到left_sum中继续遍历。
优化后的代码
class Solution: def pivotIndex(self, nums: List[int]) -> int: total = sum(nums) left_sum = 0 for i, num in enumerate(nums): # 右侧和 = 总和 - 左侧和 - 当前元素 if left_sum == total - left_sum - num: return i left_sum += num return -1
优化效果说明
- 仅调用一次sum()计算总和,后续遍历全程都是O(1)的数值运算;
- 不再需要维护left_list,空间复杂度从O(n)降到O(1);
- 整体时间复杂度从O(n²)优化为O(n),能轻松通过所有大规模测试用例。
内容的提问来源于stack exchange,提问作者Lamar Mccloud
相关产品推荐
相关产品推荐

