前缀和加哈希表
class Solution {
// 函数:subarraySum
// 功能:计算数组中和为k的子数组数量
public int subarraySum(int[] nums, int k) {
int count = 0; // count用于存储和为k的子数组数量
int currSum = 0; // currSum用于存储当前元素之前所有元素之和
Map<Integer, Integer> prefixSum = new HashMap<>(); // 创建一个HashMap用于存储前缀和及其出现的次数
prefixSum.put(0, 1); // 初始化,前缀和为0的出现一次(空子数组)
// 遍历数组中的每个元素
for (int num : nums) {
currSum += num; // 更新当前元素之前所有元素之和
// 如果HashMap中存在currSum - k的前缀和,说明找到了一个和为k的子数组
count += prefixSum.getOrDefault(currSum - k, 0); // 累加找到的子数组数量
// 将当前前缀和存入HashMap,并更新其出现次数
prefixSum.put(currSum, prefixSum.getOrDefault(currSum, 0) + 1);
}
// 返回和为k的子数组数量
return count;
}
}
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
count = 0
prefix_sum = {0: 1} # 初始化前缀和字典,0: 1 表示空子数组
curr_sum = 0
for num in nums:
curr_sum += num
if curr_sum - k in prefix_sum:
count += prefix_sum[curr_sum - k]
prefix_sum[curr_sum] = prefix_sum.get(curr_sum, 0) + 1
return count