给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
java
class Solution {
public int subarraySum(int[] nums, int k) {
int ans=0;
for (int l = 0; l < nums.length; l++) {
int sum=0;
for (int r = l; r<nums.length; r++) {
sum+=nums[i];
if (sum==k){
ans++;
}
}
}
return ans;
}
}
这个题还可以进行优化,我们可以使用前缀和。我们可以使用pre前缀和。我们只需要判断前缀和里是否存在 k-pre就可以了
java
import java.util.HashMap;
class Solution {
public int subarraySum(int[] nums, int k) {
int count=0,pre=0;
//定义前缀和
HashMap<Integer, Integer> mp = new HashMap<>();//key存放前缀和,count记录前缀和出现的次数
mp.put(pre,1);
for (int i = 0; i < nums.length; i++) {
pre+=nums[i];//计算当前前缀和
if (mp.containsKey(k-pre)){
count+=mp.get(k-pre);//获取k-pre的前缀和出现的次数
}
mp.put(pre,mp.getOrDefault(pre, 0) + 1);//将该前缀出现的次数+1并放入map中
}
return count;
}
}