题目
给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
示例 1:
输入:nums = [1, 7, 3, 6, 5, 6] 输出:3 解释: 中心下标是 3 。 左侧数之和 (1 + 7 + 3 = 11), 右侧数之和 (5 + 6 = 11) ,二者相等。
示例 2:
输入:nums = [1, 2, 3] 输出:-1 解释: 数组中不存在满足此条件的中心下标。
示例 3:
输入:nums = [2, 1, -1] 输出:0 解释: 中心下标是 0 。 下标 0 左侧不存在元素,视作和为 0 ; 右侧数之和为 1 + (-1) = 0 ,二者相等。
解题
方法一:前缀和 (pre_sum)
记数组的全部元素之和为total,当遍历到第 i个元素时,设其左侧元素之和为pre_sum,则其右侧元素之和为total−pre_sum−nums[i],左右侧元素相等即为
当中心索引左侧或右侧没有元素时,即为零个项相加,这在数学上称作「空和」(empty sum)。在程序设计中我们约定「空和是零」。
class Solution: def pivotIndex(self, nums: List[int]) -> int: pre_sum = 0 total = sum(nums) for i in range(0,len(nums)): if (2*pre_sum+nums[i])==total: #if pre_sum==total-pre_sum-nums[i]一样的道理 return i pre_sum+=nums[i] return -1
preSum原理简单,在解决数组的区间和的时候,十分有用,大家务必掌握
c++写法
class Solution { public: int pivotIndex(vector<int>& nums) { int n=nums.size(); vector<int> preSum(n); preSum[0]=nums[0]; int total=nums[0]; for(int i=1;i<n;i++){ preSum[i]=preSum[i-1]+nums[i]; total+=nums[i]; } for(int i=0;i<n;i++){ if(preSum[i]-nums[i]==total-preSum[i]) return i; } return -1; } };