给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
以下是使用前缀和与哈希表来解决该问题的 Python 代码,时间复杂度为 O(n),空间复杂度为 O(n):
class Solution:
def subarraySum(self, nums, k):
# 初始化前缀和为 0,出现次数为 1
pre_sum = {0: 1}
count = 0
sum_ = 0
for num in nums:
# 计算当前前缀和
sum_ += num
# 如果前缀和-k 在哈希表中,说明存在和为 k 的子数组,计数增加
if sum_ - k in pre_sum:
count += pre_sum[sum_ - k]
# 将当前前缀和的出现次数加 1 放入哈希表
if sum_ in pre_sum:
pre_sum[sum_] += 1
else:
pre_sum[sum_] = 1
return count
整体思路如下:
我们使用前缀和的方法来解决这个问题。
首先,定义一个哈希表 pre_sum
来存储前缀和以及其出现的次数,初始时前缀和为 0 的出现次数为 1。然后遍历数组中的每个元素。
对于当前元素,计算前缀和 sum_
,接着判断 sum_ - k
是否在哈希表中,如果在,就说明存在一个子数组的和为 k
,那么将对应的出现次数累加到结果计数 count
中。
同时,将当前前缀和在哈希表中的出现次数加 1(如果已经存在就更新次数,否则添加新的项)。
这样,通过一次遍历数组,利用哈希表快速查找和统计,就能高效地得到和为 k
的子数组的个数。