一、刷题内容
原题链接
https://leetcode-cn.com/problems/subarray-sum-equals-k/
内容描述
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e^7, 1e^7]。
二、解题方法
1.方法一:哈希表
1.遍历,计算从索引0开始到当前位置的所有子串和total,并将该和的出现次数存入哈希表count中
2.在遍历过程中,若子串和为k,数量res + 1
3.若当前子串和total减去k在哈希表中出现过,数量res + 该差值出现的次数
解释一下如果total - k在哈希表中出现过意味着什么
比如前面几个数字相加和为x,再加上后面几个数以后和变成x + k = total,说明从和为x的数到当前数之间的数和为k,所以相应的次数res要增加,此时的情况就是 total - k = x 这个x在之前已出现过,且出现过几次res就增加几
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
total = 0
res = 0
count = {}
for num in nums:
total += num
if total == k:
res += 1
if total - k in count:
res += count[total - k]
count[total] = count.get(total, 0) + 1
return res
时间复杂度:O(n)
空间复杂度:O(n)