题目来源:https://leetcode-cn.com/problems/QTMn0o/
大致题意:
给一个数组和整数 k,求出和为 k 的子数组的个数
思路
使用哈希表统计数组的前缀和以及出现的次数,每次使用当前前缀和减去 k,若差值在哈希表出现过,表示已经遍历的子数组中存在子数组的和为 k,前缀和在哈希表中对应的值即为出现次数
具体实现时,可以直接用原数组存前缀和
代码:
class Solution {
public int subarraySum(int[] nums, int k) {
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
int ans = 0;
// 因为不遍历第一个元素,提前判断
ans = nums[0] == k ? 1 : 0;
// 放入不含任何元素的前缀和,即前缀和为 0
map.put(0, 1);
// 放入首元素的前缀和
map.put(nums[0], map.getOrDefault(nums[0], 0) + 1);
for (int i = 1; i < n; i++) {
// 当前前缀和
nums[i] += nums[i - 1];
// 差值
int val = nums[i] - k;
// 更新答案
ans += map.getOrDefault(val, 0);
// 更新哈希表
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
return ans;
}
}