题目:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例:
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
思路:
前缀和,使用哈希表
键用来存累加的和,对应的值存的是累加和出现的次数,遍历数组中的数,然后累加进结果当中。
当和等于整数K的时候,连续子数组的个数加1,
当这个和已经出现过,在字典中有时,将次数加1,否则,字典中加入当前和,设置次数为1,
注意当累加和减去K在字典中存在时,说明数组中到当前遍历数的位置的后边一段相加就是K,满足连续子数组和为K,所以连续子数组的个数要加上累加和减去k这个数对应的次数,一般情况下,这个次数就是1,当有0的时候,这个次数就变了,这时连续子数组个数的情况也会增加,所以次数加的是对应的键值,最后返回连续子数组的个数。
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
d = {}
total = count = 0
for num in nums:
total += num
if total == k:
count += 1
if total - k in d:
count += d[total - k]
if total in d:
d[total] += 1
else:
d[total] = 1
return count