对于数组和的处理
考虑i到j的和 为 sum(:j)-sum(:i)用来替代中间和
974. 和可被 K 整除的子数组
给定一个整数数组 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]
提示:
1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000
解答:
想法:
1 一开始想到暴力解答,循环得到sum然后得到mod,满足则加一,百分百超时
2 考虑使用字典记录已经存在的i,j区间的mod,使用回溯法,最后仍然超时,也是进行了n^2的遍历
3. 看答案,对mod进行字典存储,同一mod的区间相减 肯定满足被K整除!对key的val进行遍历,使用C(n,2)的概率统计法,则可以得到该mod的整除区间
(特殊情况:mod为0的情况,自加一!因为本身相当于多一个起点,一开始就能做到被整除)
代码:
class Solution:
def subarraysDivByK(self, A, K):
temp = {0:1}
count = 0
for i in range(len(A)):
count+=A[i]
a,b = divmod(count,K)
if b in temp:
temp[b]+=1
else:
#print(i,b)
temp[b]=1
#print(temp)
res = 0
for key in temp:
if temp[key]>1:
res+=(temp[key]*(temp[key]-1))/2
return int(res)
su = Solution()
arr = [4,5,0,-2,-3,1]
K = 5
res = su.subarraysDivByK(arr,5)
print(res)