LintCode 138 [Subarray Sum]

原题

给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置。

给出[-3, 1, 2, -3, 4],返回[0, 2] 或者** [1, 3].**

解题思路

  • 使用一个hash map记录前n项和,初始化dict[0] = -1 => 前-1 + 1 = 0项和等于0
  • 以此类推,前1项和等于-3,前2项和等于-2,前3项和等于0,此时发现0存在于dict中,dict[0] = -1,所以加入-1 + 1i,res = [0, 2]
  • 也就是说一旦发现前i项和等于前j项和,那么i~j这一段的和等于零,把坐标加入到res数组

完整代码

class Solution:
    """
    @param nums: A list of integers
    @return: A list of integers includes the index of the first number 
             and the index of the last number
    """
    def subarraySum(self, nums):
        dict = {}
        dict[0] = -1
        sum = 0
        res = []
        for i, num in enumerate(nums):
            sum += num
            if sum in dict:
                res.append(dict[sum] + 1)
                res.append(i)
                return res
            dict[sum] = i

你可能感兴趣的:(LintCode 138 [Subarray Sum])