给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
1、使用前缀和
class Solution {
public int subarraySum(int[] nums, int k) {
int res = 0;
int[] preArr = new int[nums.length+1];
for(int i = 1;i < nums.length + 1;i ++ ){
preArr[i] = preArr[i - 1] + nums[i - 1];
}
for(int i = 1;i < nums.length + 1;i ++){
for(int j = 0;j < i;j ++){
if(preArr[i] - preArr[j] == k){
++res;
}
}
}
return res;
}
}
执行用时:1850 ms, 在所有 Java 提交中击败了4.99%的用户
内存消耗:43.5 MB, 在所有 Java 提交中击败了84.69%的用户
通过测试用例:92 / 92
2、使用前缀和加HashMap
class Solution {
public int subarraySum(int[] nums, int k) {
int len = nums.length;
//前缀和,前缀和出现的次数
HashMap<Integer,Integer> sumMap = new HashMap<>();
sumMap.put(0,1);
int res = 0;
int sum0 = 0;
for(int i = 0; i < len;i ++){
sum0 += nums[i];
int sum1 = sum0 - k;
if(sumMap.containsKey(sum1)){
res += sumMap.get(sum1);
}
sumMap.put(sum0,sumMap.getOrDefault(sum0,0) + 1);
}
return res;
}
}
执行用时:22 ms, 在所有 Java 提交中击败了68.62%的用户
内存消耗:45.9 MB, 在所有 Java 提交中击败了6.05%的用户
通过测试用例:92 / 92