给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
求的是sum(i, j)=k的个数。这个式子可以进行一些分解
分解1:sum(i, j)=sum(i, j-1)+nums[j]=k 变成
sum(i,j-1) = k-nums[j],检查这样的sum(i,j-1)是否存在
分解2:sum(i, j) = sum(0, j)-sum(0, i-1) = k
sum(0, i-1) = sum(0, j)-sum(i, j)=sum(0, j)-k,检查这样的sum(0, i-1)是否存在。
分解2比分解1好的地方就在于,不用频繁更新缓存的结果,每次j+1,都只要更新sum(0, j+1)。而分解1,每次j+1都需要对sum(i, j)进行一次+nums[j+1]操作。
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0;
for(int val: nums)
{
sum += val;
if(map.containsKey(sum-k))
count += map.get(sum-k);
map.put(sum, map.getOrDefault(sum, 0)+1);
}
return count;
}
}