定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
解法一:
public int subarraySum(int[] nums, int k) {
int len = nums.length;
int []preSum = new int[len + 1];
preSum[0] = 0;
for(int i = 0; i < len; i++){
preSum[i + 1] = preSum[i] + nums[i];
}
int result = 0;
for(int i = 1; i <= len; i++){
for(int j = 0;j < i; j++){
if(preSum[i] - preSum[j] == k){
result++;
}
}
}
return result;
}
解法二:
public int subarraySum(int[] nums, int k) {
int len = nums.length;
//使用HashMap及时记录更新结果
Map<Integer,Integer> preSum = new HashMap<>();
//初始化记录前缀和的preSum,前缀和为0,出现次数为1次
preSum.put(0,1);
int result = 0, sum_i = 0;
for(int i = 0; i < len; i++){
sum_i += nums[i];
//寻找符合要求的前缀和
int sum_j = sum_i - k;
//如果前面有这个前缀和,更新result
if(preSum.containsKey(sum_j))
result += preSum.get(sum_j);
//更新preSum
preSum.put(sum_i,preSum.getOrDefault(sum_i,0) + 1);
}
return result;
}