题目链接: 连续的子数组
使用方法: 前缀和数组+哈希化
因为有考虑所有的子树组, 可以使用前缀和+哈希来简化问题
对于[i…j], 如果
pre[j] - pre[i - 1] = k * n;
那么pre[i - 1] = pre[j] - k * n, 只要存在满足条件的i, 那么返回true, 否则返回false
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
if (nums.size() < 2) return false;
unordered_map<int, int> s;
int pre = 0;
for (int i = 0; i < nums.size(); i++) {
pre += nums[i];
if (i < 1) { // 将数组的第一个数送入哈希表
s[pre] = i + 1;
continue;
}
if (pre % k == 0) return true;
// 这里找到是否有k的整数倍的子数组
for (int j = 0; j < pre; j += k) {
if (!s[pre - j]) continue; // 如果不存在, 那么跳过
if (i + 1 - s[pre - j] > 1) return true; // 如果子数组的长度不大于1, 那么跳过
}
if (!s[pre]) s[pre] = i + 1;
}
// for (auto it = s.begin(); it != s.end(); it++) {
// cout << it->first << " " << it->second << endl;
// }
return false;
}
};