724. 寻找数组的中心索引
方法一:运用数学技巧
def pivotIndex(self, nums): """ :type nums: List[int] :rtype: int """ sumi = 0 s = sum(nums) for i in range(len(nums)): if 2 * sumi + nums[i] == s: return i sumi += nums[i] return -1
方法二:双指针
class Solution(object): """ 两个指针(左指针i,右指针j)都从左往右走,统计两边的和,和相等即返回; 由于中心索引可以是所有有效下标: (1)左侧指针从-1开始,左侧累加和初始为零; (2)右侧指针从1开始,右侧累加和初始为:sum(nums) - nums[0]; 循环条件: 右指针指向的下标小于数组长度,即:j < len(nums); 循环体: (1)若相等,则返回i+1 (2)否则,左指针i右移,左侧和累加;右侧和减掉j指针当前指向的元素,再将右指针右移; 另外,考虑到中心索引可能为len-1,所以循环体外需要再判断一次。 """ def pivotIndex(self, nums): """ :type nums: List[int] :rtype: int """ if not nums or len(nums) < 3: return -1 i, j = -1, 1 sumi, sumj = 0, sum(nums) - nums[0] # print(sumi, sumj) while j < len(nums): if sumi == sumj: return i + 1 else: i += 1 sumi += nums[i] # 这里要注意: # 不能先j+=1,再计算sumj,因为当前j指向的值是sumj没有减掉的。 sumj -= nums[j] j += 1 if sumi == sumj: return i + 1 return -1