我们将获得一个整数数组和一个值
我在LeetCode上发现了一些有趣的代码,如下所示:
为了理解它,我走了一些具体的例子,比如
我有两个特定的困惑点:
1) 为什么代码要不断地将数组中的值相加,而不将其清零?例如,在
2) 当我们找到一个和为
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) 当我们找到一个和为
k
的子数组时,我们不应该只需执行result++
吗?为什么要添加preSum.get(sum-k)
?
result++
,因为新条目可能会导致发现多个新的子数组。例如,考虑k=6
和[1,2,3,0,3]
(3个子数组)与[1,2,3,0,3,3]
(5个子数组)。当我们找到额外的3时,它会导致发现2个新的和为6的子数组([3,3]和[0,3,3]);result++
只会增加1。 - River