题目
前缀和
public int subarraySum(int[] nums, int k) {
// 利用前缀和计算
// dp[i] = nums[0] + nums[1] + ... + nums[i]
int [] dp = new int[nums.length];
for (int i = 0; i < nums.length; i ++) {
if (i == 0) {
dp[i] = nums[0];
} else {
dp[i] = dp[i - 1] + nums[i];
}
}
Map<Integer, Integer> record = new HashMap<>();
// 题目可转化为 dp[j] - dp[i] + nums[i] == k
// 目标为寻求dp[j] = k + dp[i] - nums[i]
int count = 0;
for (int i = 0; i < nums.length; i ++) {
record.put(k + dp[i] - nums[i], record.getOrDefault(k + dp[i] - nums[i], 0) + 1);
count += record.getOrDefault(dp[i], 0);
}
return count;
}
基本思路
-
因为数组中元素可正, 可负, 因此通过前缀和来计算,
-
在map中添加元素的时候, 先put, 再get, 来得到是不是i和j相等的情况