问题
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
示例
输入:A = [4,5,0,-2,-3,1], K = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
代码
class Solution {
public:
int subarraysDivByK(vector<int>& A, int K) {
int n = A.size();
int result = 0;
int sum=0;
unordered_map<int,int> data={{0,1}};
for(int i=0;i<n;i++){
sum+=A[i];
int modules=(sum%K+K)%K;
if(data.count(modules)){
result+=data[modules];
}
data[modules]++;
}
return result;
}
};
题解
反思
(1)注意被K整除是这个数除以K之后没有余数
(2)此题暴力是通不过的,必须减少时间复杂度
(3)连续整除的数组,可以参考官方的思路如下:
子数组能否被K整除就等价于判断(P[i]-P[j])modK==0
(4)注意同余定理的使用