【发布时间】:2018-08-13 20:23:24
【问题描述】:
我在 Leetcode 上遇到了这个问题,我看到了解决方案,但我无法理解它为什么有效。它适用于模量的什么性质? 我们怎么能说我们找到了一个总和等于k的子数组,只看之前出现的模结果呢?
问题:
给定一个非负数列表和一个目标整数k,编写一个函数来检查数组是否有一个大小至少为2且总和为k的倍数的连续子数组,即总和为n *k 其中 n 也是一个整数。
示例 1: 输入:[23, 2, 4, 6, 7], k=6 输出:真 解释:因为 [2, 4] 是一个大小为 2 的连续子数组,总和为 6。
解决方案:
public boolean checkSubarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>(){{put(0,-1);}};;
int runningSum = 0;
for (int i=0;i<nums.length;i++) {
runningSum += nums[i];
if (k != 0) runningSum %= k;
Integer prev = map.get(runningSum);
if (prev != null) {
if (i - prev > 1) return true;
}
else map.put(runningSum, i);
}
return false;
}
【问题讨论】:
-
你应该开始使用调试器,看看这段代码发生了什么(变量是如何改变的)。除此之外,如果此代码有效,如您所说,在Code Review 中提出此问题更为合适