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]<=100002<=K<=10000解题思路:Prefix和Integer,Python使用向下舍入。可能与预期有偏差,例如,当除数为负时。看下面的例子:>>>10//33>>>10%31>>>10//-3-4>>>10%-3-2你可以在这里看到,关于正数的舍入,模遵循Expected不会偏离太多。但对于负数,结果可能与预期的不一样。这是因为,如前所述,Python使用向下舍入。对于10÷-3=-3.3333,向下舍入将得到-4,则余数为-2。这就是出现上述结果的原因。这部分只是一个提示。在这道题中,K是除数。题目说的是[2<=K<=10000],所以不会出现这种情况。但是Python中负数取余的结果是正数,这一点与其他一些编程语言不同。在某些语言中,负数取余的结果是负数,因此需要额外的处理。本文使用了前缀and的思想。关于前缀和,给个大概的解释。如果要求前i项的和,则:P[i]=A[0]+A[1]+...+A[i]对应的前i-1项的和为:P[i-1]=A[0]+A[1]+...+A[i-1]那么,A[i]的值也可以表示为A[i]=P[i]-P[i-1]那么相应的,如果要计算从第i项到第j项的连续子数组的和,也可以写成如下形式:sum[i...j]=P[j]-P[i-1],where(0int:#这里是前缀和自身被K整除的情况hashmap={0:1}pre_sum=0cnt=0foriinrange(len(A)):pre_sum+=A[i]#模数mod=pre_sum%K#这里使用了字典的get方法#当存在相同的key时,累加到cntifmodinhashmap:cnt+=hashmap[mod]hashmap[mod]+=1#如果key在哈希表中,则数字加1,#否则初始化为1else:hashmap[mod]=1returncnt实现以上结果是使用前缀和的思路,主要内容是解决《974. 和可被 K 整除的子数组》的问题。欢迎关注微信公众号《书所集录》
