前缀和
思路跟 路径总和3 是一样的
算法思路
- 使用前缀和currSum - k的数量间接反映和为k的连续子数组数量。
- 使用一个变量
currSum = 0计算当前和,即从0 + nums[0] + ... + nums[n - 1]。每加一次,判断是否存在前缀和currSum - k。 - 什么前缀和?比如,
[1, 2, 3],如果k = 2,当currsum = 1 + 2 = 3,currSum - k = 1,而之前的计算中存在currSum = 1,也就是存在前缀和为1。子数组和currSum = 3存在,前缀和currSum = 1存在,所以子数组和currSum = 2存在,也就是k存在。 - 使用哈希表
preSum来保存前缀和及它的数量,<currSum, numberOfcurrSum>。
class Solution {
public int subarraySum(int[] nums, int k) {
int res = 0;
int currSum = 0;
HashMap<Integer, Integer> preSum = new HashMap<>();
preSum.put(0, 1);
for (int i = 0; i < nums.length; i++) {
currSum += nums[i];
if (preSum.containsKey(currSum - k)) {
res += preSum.get(currSum - k);
}
preSum.put(currSum, preSum.getOrDefault(currSum, 0) + 1);
}
return res;
}
}