题解
借助哈希表保存累加和 s u m sum sum及出现的次数。若累加和 s u m − k sum-k sum−k在哈希表中存在,则说明存在连续序列使得和为 k k k。则之前的累加和中, s u m − k sum-k sum−k出现的次数即为有多少种子序列使得累加和为 s u m − k sum-k sum−k。
哈希
-
初始化哈希表 h a s h = { 0 : 1 } hash=\{0:1\} hash={0:1},表示累加和为 0 0 0,出现了 1 1 1次。初始化累加和 s u m = 0 sum=0 sum=0。初始化结果 c o u n t = 0 count=0 count=0。
-
遍历数组:
- 更新累加和 s u m + = n u m s [ i ] sum+=nums[i] sum+=nums[i]
- 若 s u m − k sum-k sum−k存在于 h a s h hash hash中,说明存在连续序列使得和为 k k k。则令 c o u n t + = h a s h [ s u m − k ] count+=hash[sum-k] count+=hash[sum−k],表示 s u m − k sum-k sum−k出现几次,就存在几种子序列使得和为 k k k。
- 若 s u m sum sum存在于 h a s h hash hash中,将其出现次数加一。若不存在,将其加入 h a s h hash hash
-
返回 c o u n t count count
复杂度分析
- 时间复杂度: O ( n ) O\left(n\right) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
Python
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
hash={0:1}
sum=0
count=0
for i in range(len(nums)):
sum+=nums[i]
if((sum-k) in hash):
count+=hash[sum-k]
if(sum in hash):
hash[sum]+=1
else:
hash[sum]=1
return count