
class Solution {
//method 1
public int subarraySum(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return 0;
}
int[] preSum = new int[nums.length + 1];//1、构造前缀和
for (int i = 1; i <= nums.length; i++) {
preSum[i] = preSum[i - 1] + nums[i - 1];
}
int res = 0;
for (int i = 1; i <= nums.length; i++) {//2、穷举所有元素
for (int j = 0; j < i; j++) {
if (preSum[i] - preSum[j] == k) {//3、nums[j,...,i-1]的和
res++;
}
}
}
return res;
}
//method 2 优化后的方法,使用map替代preSum数组,因为map查找元素时间复杂度O(1)
public int subarraySum(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return 0;
}
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int res = 0, preSum = 0;
for (int i = 0; i < nums.length; i++) {
preSum += nums[i];//记录前缀和
if (map.containsKey(preSum - k)) {//有满足条件的前缀和
res += map.get(preSum - k);
}
map.put(preSum, map.getOrDefault(preSum, 0) + 1);//更新满足提议的前缀和个数
}
return res;
}
}