题目
给你一个整数数组
nums
和一个整数k
,请你统计并返回 该数组中和为k
的子数组的个数 。子数组是数组中元素的连续非空序列。
解题
"""
时间复杂度: O(n),其中 n 是数组的长度。我们只遍历一次数组。
空间复杂度: O(n),在最坏的情况下,哈希表中需要存储 n 个不同的前缀和。
"""
def subarraySum(nums, k):
prefix_sums = {0: 1} # 初始化前缀和字典,包含 sum=0 出现 1 次
current_sum = 0
count = 0
for num in nums:
current_sum += num # 计算当前前缀和
# 查找是否存在一个前缀和,使得 current_sum - previous_sum = k
if current_sum - k in prefix_sums:
count += prefix_sums[current_sum - k]
# 更新当前前缀和出现的次数
if current_sum in prefix_sums:
prefix_sums[current_sum] += 1
else:
prefix_sums[current_sum] = 1
return count
# 示例 1
nums = [1, 1, 1]
k = 2
print(subarraySum(nums, k)) # 输出: 2