1.和为 K 的子数组
问题:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
方法1:暴力枚举
# 方法1:暴力枚举(遍历子数组起点和终点,统计其中的和,并与目标k对比)
def sum_k(nums, k):
res = 0
# 遍历子数组起点
for i in range(len(nums)):
cur_sum = 0 # 注:这里不能直接为nums[i](会漏判、漏计数)
# 遍历子数组终点
for j in range(i, len(nums)):
cur_sum += nums[j]
if cur_sum == k:
res += 1
return res
方法2:前缀和 + 哈希表
# 方法2:前缀和+哈希表
# 边走边算,看有没有 当前总和 - k 出现过,出现几次就有几个子数组和为k
def sum_k(nums, k):
pre_sum, res = 0, 0
cnt = collections.defaultdict(int)
cnt[0] = 1
# 更新前缀和并计数
for num in nums:
pre_sum += num # 更新前缀和
res += cnt[pre_sum - k] # 找之前和是否存在(当前和-之前和=k ==> 之前和=当前和-k)
cnt[pre_sum] += 1 # 最后更新,避免匹配当前值
return res