我们将得到一个整数数组和一个值k
。我们需要找到总和等于的子数组的总数k
.
我在网上(Leetcode)发现了一些有趣的代码,如下:
public class Solution {
public int subarraySum(int[] nums, int k) {
int sum = 0, result = 0;
Map<Integer, Integer> preSum = new HashMap<>();
preSum.put(0, 1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (preSum.containsKey(sum - k)) {
result += preSum.get(sum - k);
}
preSum.put(sum, preSum.getOrDefault(sum, 0) + 1);
}
return result;
}
}
为了理解它,我浏览了一些具体的例子,比如[1,1,1,1,1]
with k=3
and [1,2,3,0,3,2,6]
with k=6
。虽然代码在这两种情况下都能完美运行,但我无法理解它实际如何计算输出。
我有两个具体的困惑点:
1)为什么代码不断地添加数组中的值,而不将其清零?例如,如果[1,1,1,1,1]
with k=3
, once sum=3
,我们不需要重置吗sum
为零?不重置sum
干扰查找后面的子数组?
2)我们不应该简单地做result++
当我们找到 sum 的子数组时k
?为什么我们要添加preSum.get(sum-k)
反而?