前缀和 创建一个新数组不断保存i处的前缀和 preSum
想得到特定的i->j的和 preSum[j+1] - preSum[i] 即为i->j的和
想找到和为k的子数组的个数 即为 找到 preSum[j+1] - preSum[i] = k 的不同组合
遍历preSum[] preSum[i] = preSum[j+1] + k 每次遍历取出的元素相当于preSum[j+1] 判断是否存在preSum[i] 即可
将结果存入到hashMap中 便于后续判断是否存在preSum[i] 以及出现次数
class Solution {
public int subarraySum(int[] nums, int k) {
//前缀和 创建一个新数组不断保存i处的前缀和 preSum
//想得到特定的i->j的和 preSum[j+1] - preSum[i] 即为i->j的和
//想找到和为k的子数组的个数 即为 找到 preSum[j+1] - preSum[i] = k 的不同组合
//遍历preSum[] preSum[i] = preSum[j+1] + k 每次遍历取出的元素相当于preSum[j+1] 判断是否存在preSum[i] 即可
//将结果存入到hashMap中 便于后续判断是否存在preSum[i] 以及出现次数
//创建前缀和数组
int[] preSum = new int[nums.length + 1]; //第一个元素为0(首元素没有前缀)
preSum[0] = 0; //初始化首元素的前缀和
for(int i = 0; i < nums.length; i++) {
preSum[i + 1] = preSum[i] + nums[i];
}
//创建hashMap存储结果
Map<Integer,Integer> hash = new HashMap<>();
//符合条件的子数组个数
int count = 0;
//遍历前缀和
for(int pre : preSum) {
if(hash.containsKey(pre - k)) { //若存在一个前缀和 等于当前前缀和-key 说明存在相加等于k的子数组
count += hash.get(pre - k);//更新符合条件的子数组个数
}
hash.put(pre,hash.getOrDefault(pre,0) + 1); //将当前前缀和添加到hashMap中 若在这之前不存在则为1 存在则之前次数+1
}
return count;
}
}