【发布时间】:2018-03-25 00:44:20
【问题描述】:
我正在尝试解决LeetCode.com 上的问题:
给定一个非负数列表和一个目标整数k,编写一个函数来检查数组是否有一个大小至少为2且总和为k的倍数的连续子数组,即总和为n *k 其中 n 也是一个整数。例如,如果
[23, 2, 4, 6, 7]、k=6,则输出应为True,因为[2, 4]是大小为2 且总和为6 的连续子数组。
我正在尝试理解以下solution:
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int n = nums.size(), sum = 0, pre = 0;
unordered_set<int> modk;
for (int i = 0; i < n; ++i) {
sum += nums[i];
int mod = k == 0 ? sum : sum % k;
if (modk.count(mod)) return true;
modk.insert(pre);
pre = mod;
}
return false;
}
};
我了解我们正在尝试将:0, (a/k), (a+b)/k, (a+b+c)/k 等存储到 hashSet(其中 k!=0)中,并且我们在 下一个迭代中这样做,因为我们希望子数组大小至少为2。
但是,这如何保证我们得到一个元素总和为k 的子数组?什么数学性质保证了这一点?
【问题讨论】: