本题解使用了前缀和与哈希表的组合策略。首先,定义一个变量 `cur_sum` 来存储从数组开始到当前元素的连续子数组的和。使用一个哈希表 `pre_dict` 来记录所有可能的前缀和的出现次数,其中键是前缀和,值是该前缀和出现的次数。在遍历数组的每个元素时,更新 `cur_sum`。接下来,检查 `cur_sum - k` 是否存在于 `pre_dict` 中,如果存在,表示找到了一个和为 `k` 的子数组,其次数为 `pre_dict[cur_sum - k]`。然后,更新哈希表,增加当前 `cur_sum` 的计数。这种方法能够有效地在一次遍历中计算出和为 `k` 的子数组的数量。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
cur_sum, count = 0, 0 # 初始化当前和与计数器
pre_dict = {0: 1} # 初始化哈希表,用于存储前缀和及其出现次数
for i in range(len(nums)): # 遍历数组每个元素
cur_sum += nums[i] # 更新当前前缀和
if cur_sum - k in pre_dict: # 如果当前前缀和减去k在哈希表中存在
count += pre_dict[cur_sum - k] # 累加对应的次数到计数器
if cur_sum in pre_dict: # 如果当前前缀和已存在于哈希表
pre_dict[cur_sum] += 1 # 更新该前缀和的计数
else: # 如果当前前缀和不在哈希表中
pre_dict[cur_sum] = 1 # 在哈希表中记录这个前缀和
return count # 返回计数器的值