题目描述
定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
给定一个整数类型的数组 nums,返回数组“中心索引”。如果数组不存在中心索引,那么返回 -1。如果数组有多个中心索引,那么返回最靠近左边的那一个。
注意:nums 的长度范围为 [0, 10000]。
示例
输入: nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释: 索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。同时, 3 也是第一个符合要求的中心索引。
输入: nums = [1, 2, 3]
输出: -1
解释: 数组中不存在满足此条件的中心索引。
解答
注意:如果中心索引 i 为0,则左侧和为0;如果 i 为length-1,则右侧和为0
解答1
遍历数组,分别计算当前num的左右两侧的和
class Solution(object):
def pivotIndex(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums)
if length<=1:
return -1
l_sum = 0 # 左侧和
r_sum = sum(nums) - nums[0] # 右侧和
# 如果i为0,则左侧和为0
# 如果i为length-1,则右侧和为0
# 假定i为中心索引
i = 0
while i<length:
# 左侧和等于右侧和,返回i
if l_sum == r_sum:
return i
# 两侧和不相等,i向后一位,更新两侧和
# 两侧和都不包括i
elif i<length-1:
l_sum = l_sum + nums[i]
i += 1
r_sum = r_sum - nums[i]
# i为length-1,右侧和为0
elif i==length-1:
l_sum = l_sum + nums[i]
i += 1
r_sum = 0
# 循环中没有返回,说明没有中心索引
return -1
解答2
评论区的一个回答,只需计算一侧的和即可
l_sum + r_sum + nums[i] = sum
如果i是中心索引,则l_sum=r_sum,则l_sum*2+nums[i]=sum
class Solution(object):
def pivotIndex(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums)
if length<=1:
return -1
# 参考评论区
# l_sum + r_sum + nums[i] = sum
# 如果i是中心索引,则l_sum=r_sum,则l_sum*2+nums[i]=sum
nums_sum = sum(nums)
l_sum = 0
for i in range(0,length):
if l_sum*2+nums[i]==nums_sum:
return i
l_sum = l_sum + nums[i]
# 循环中没有返回,说明没有中心索引
return -1