【发布时间】:2017-07-12 19:32:34
【问题描述】:
我们会得到一个整数数组和一个值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] 和k=3 和[1,2,3,0,3,2,6] 和k=6。虽然代码在这两种情况下都能完美运行,但我没有遵循它实际计算输出的方式。
我有两个具体的困惑:
1) 为什么代码会不断地在数组中添加值,而不会将其清零?例如[1,1,1,1,1] 和k=3,一旦sum=3,我们不需要将sum 重置为零吗?不重置sum 不会影响查找后面的子数组吗?
2) 当我们找到 sum k 的子数组时,我们不应该简单地做 result++ 吗?为什么我们要添加preSum.get(sum-k)?
【问题讨论】: