724. 寻找数组的中心下标 Easy
给你一个整数数组 nums
,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。
示例 2:
输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。
示例 3:
输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0
解题思路
输入:一个整数数组 nums
输出:找出最左侧的中心下标,中心下标满足 左侧所有元素相加的和等于右侧所有元素相加的和
本题属于一维前缀和问题。
我们可以先计算出所有的总和 total
,再用一个变量记录当前数字的前缀和 prefix
,通过 suffix = total - prefix - nums[i]
可以得到后缀和
从左往右遍历只要满足 前缀和 = 后缀和
的数字就是最左侧的数字,返回下标
遍历完后没有返回则说明没有找到,返回 -1
代码实现
python
from typing import List
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
total = sum(nums) # 计算整个数组的总和
left_sum = 0 # 初始化左侧前缀和为 0
for i, num in enumerate(nums):
# 如果左边的前缀和等于右边的前缀和,则返回当前索引
# 右边前缀和 = 总和 - 当前值 - 左边前缀和
if left_sum == total - num - left_sum:
return i
left_sum += num # 更新左侧前缀和
return -1 # 如果没有找到满足条件的下标,返回 -1
javascript
var pivotIndex = function(nums) {
// 1. 先计算整个数组的总和
const total = nums.reduce((acc, cur) => acc + cur, 0);
// 2. prefix 记录当前位置左边元素的和
let prefix = 0;
for (let i = 0; i < nums.length; i++) {
// 如果左边的和 == 右边的和,则找到中心索引
// 右边和 = 总和 - 左边和 - 当前元素
if (prefix === total - prefix - nums[i]) {
return i;
}
// 更新左边和(把当前元素加进去)
prefix += nums[i];
}
// 3. 遍历结束仍未找到,返回 -1
return -1;
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)