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

  

 

posted @ 2020-04-29 09:35  人间烟火地三鲜  阅读(182)  评论(0编辑  收藏  举报