题目
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。链接
思路
560题的换皮题目,想到了前缀和不知道同余定理。。简单说就是
m m m是大于1的整数, a a a、 b b b 是整数,如果 m ∣ ( a − b ) m|(a-b) m∣(a−b),则称 a a a与 b b b关于模 m m m同余。
由定义,(a-b) mod m == 0 -> a mod == b mod m
用map
存储每个前缀和,以模结果为key
,出现的次数为value
,遇到相同的key
即找到了一个满足和被K
整除的子串。
class Solution {
public int subarraysDivByK(int[] A, int K) {
Map<Integer,Integer>map=new HashMap<>();
int sum=0,res=0;
//put(0,1)表示当前前缀和本身被K整除
map.put(0,1);
for(int i=0;i<A.length;i++){
sum+=A[i];
//java的%运算时取余
int mod=Math.floorMod(sum,K);
int sameMod=map.getOrDefault(mod,0);
res+=sameMod;
map.put(module,sameMod+1);
}
return res;
}
}