元素和能被 K 整除的子数组数目 有几种 i、j组合,使得 A[i] 到 A[j]之和 mod K == 0 =>
A[i]到A[j]之和等价于(Sum[j]-Sum[i-1])mod k ==0 =>
进一步等价与 Sum[j]mod k = Sum[i-1]mod k
PS:当Sum[]为负数的情况
e.g. Sum[1] = -1 , k=4. -1%4 =-1
可以得到 负数%k,所得的余数必然在(-k,0)之间,所以需要将负数得到的余数加上K变成正数
代码(python3版本)
classSolution:defsubarraysDivByk(self,A:List[int],K:int)->int:
record ={0:1}
total,ans =0,0for elem in A:
total+=elem
modulus = total %k
if modulus <0:
modulus = modulus+k
if record.get(modulus,0)isnotNone:
same = record.get(modulus,0)
ans += same
record[modulus]= same +1else:
record[modulus]=1return ans
代码关键点:
same = record.get(modulus,0)
ans += same
record[modulus]=same+1