链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题解:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
复杂度分析
时间复杂度: O(n^2) 。为了考虑每一个子数组,我们需要一个 2 重嵌套的循环。
空间复杂度: O(n) 。 使用了长度为 n的 sum 数组。
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
vector<int> sums(nums.size(), 0);
// sum[i]表示[0...i] nums[0]...nums[i]
for(int i = 1; i < nums.size(); ++i) {
sums[i] = sums[i-1] + nums[i];
}
for(int start = 0; start < nums.size()-1; ++start) {
for(int end = start+1; end < nums.size(); ++end) {
// sum表示以nums[start...end]的数组和,nums[start]..nums[end]
int sum = sums[end] - sums[start] + nums[start];
if((sum == k) || k !=0 && sum%k == 0) {
return true;
}
}
}
return false;
}
};
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
if (nums.size() <= 0) {
return 0;
}
if (nums.size() == 1) {
if (nums[0] == 0) {
return false;
}
//return false;
}
std::unordered_map<int, int> table;
table[0] = -1;
int sum = 0;
// 同余定理:
// 如果两个都除以k的余数相等,则两个数字的差是k的倍数
for (int i = 0; i < nums.size(); ++i) {
sum += nums[i];
if (table.find(sum%k) != table.end()) {
if (i - table[sum%k] >= 2) {
return true;
}
} else {
table[sum%k] = i;
}
}
return false;
}
};