题目
题解一:逆序枚举数组
//方法一:枚举数组(顺序)
int count= 0;// 记录最终符合条件的数组个数
int n = nums.length;
for(int end = 0; end<n ; end++){
int sum = 0;//记录每一次经过的元素总和
for(int start = end; start>=0;start--){
sum += nums[start];
if(sum == k) count++;
}
}
return count;
题解二:map+前缀和
为什么map里面要存前缀和的次数,因为前缀和不一定是越加越大的,因为数组元素存在负数,所以会导致出现重复的前缀和。这样满足条件的子数组也会有多个
// 方法二:map+前缀和
int count = 0, pre = 0;
HashMap < Integer, Integer > mp = new HashMap < > ();
mp.put(0, 1);
for (int i = 0; i < nums.length; i++) {
pre += nums[i];
if (mp.containsKey(pre - k)) {//若前缀和 - k 在map存在,说明有满足条件的数组构成的前缀和
count += mp.get(pre - k);
}
//若前缀-k不存在集合中,就照常将前缀和为key 出现次数为value(初始为1.后续++)
if(mp.containsKey(pre)) mp.put(pre,mp.get(pre)+1);
else mp.put(pre , 1);
}
return count;