题目简介:
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
示例:
1 | 输入:A = [4,5,0,-2,-3,1], K = 5 |
提示:
1 <= A.length <= 30000-10000 <= A[i] <= 100002 <= K <= 10000
思路:
使用前缀和的思想,sum[i]代表以i为结尾的前缀和,若数组[i, ……, j]元素之和能被 K 整除,则(sum[j] - sum[i - 1]) % K == 0,根据同余定理,可以得到sum[j] % K == sum[i - 1] % K,所以我们将每次数组元素和除 K 的余数存入哈希表,并在遍历时判断之前有没有相同的余数,若有,则中间的一段数组便满足要求。
因为C++取模时,当被除数为负数时取模结果为负数(如 -1 % 2 == -1, 但是2 == -1 * -1 + 1,所以正确结果为1),所以求余数时需要用(sum % K + K) % K的形式。
相当于给所有的前缀和一个偏移量 K,正数取模不变,负数取模变成 K 加这个负数。
tips:
哈希表中余数为
0需赋初值1,例如sum = 3, K = 3, sum % K == 0,如果不赋初值,则这个数组无法被统计到。前缀和:一个数组的某项下标之前(包括此项元素)的所有数组元素的和。
- 同余定理:如果两个整数的差(a-b)能被m整除,那么a,b对m同余,即余数相同。
代码如下:
1 | class Solution { |