题目:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的连续子数组的个数。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
算法分析:
求连续子数组和为k
的个数,即k = s[i] - s[j-1]; s[j-1] = s[i] - k
;即为求以i
为终点的前缀和减去k
之后的前缀和为s[j-1]
的个数;
- 用哈希表记录每一个前缀和出现的次数,对于前缀和为
0
的要赋初值1
- 对于当前前缀和为
s[i]-k
的,累加之前出现的次数
class Solution {
public int subarraySum(int[] nums, int k) {
//定义前缀和数组
int[] s = new int[nums.length + 1];
for(int i = 1;i<=nums.length;i++){
s[i] = s[i-1] + nums[i-1];
}
//定义一个hash数组存储连续子数组和为k的数组个数
Map<Integer,Integer> hash = new HashMap<>();
hash.put(0,1); //和为0的个数为1
//k = s[i] - s[j-1];
//s[j-1] = s[i] - k;即求以i为终点,减去k之后的前缀和的个数的前缀和减去k之后的前缀和个数
int res = 0;
for(int i = 1;i<=nums.length;i++){
res += hash.getOrDefault(s[i]-k,0); //累加记录前缀和s[i]-k出现的次数
hash.put(s[i],hash.getOrDefault(s[i],0)+1); //记录不同前缀和出现的次数
}
return res;
}
}