目录
[560. 和为 K 的子数组](#560. 和为 K 的子数组)
[974. 和可被 K 整除的子数组](#974. 和可被 K 整除的子数组)
560. 和为 K 的子数组
解析
题解
cpp
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// 030_专题四_前缀和_和为 k 的子数组_C++
unordered_map<int, int> hash; // 统计前缀和出现的次数
int sum = 0, ret = 0;
hash[0] = 1; // 预处理整个数组的前缀和就是K
for (int x : nums)
{
sum += x; // 计算当前位置的前缀和
if (hash.count(sum - k)) ret += hash[sum - k];
hash[sum]++;
}
return ret;
}
};
974. 和可被 K 整除的子数组
解析
题解
cpp
class Solution {
public:
int subarraysDivByK(vector<int>& nums, int k) {
// 031_专题四_前缀和_和可被 k 整除的子数组_C++
unordered_map<int, int> hash;
int sum = 0, ret = 0;
hash[0] = 1;
for (int x : nums)
{
sum += x; // 当前位置的前缀和
int r = (sum % k + k) % k; // 修正后的余数
if (hash.count(r)) ret += hash[r]; // 统计结果
hash[r]++;
}
return ret;
}
};