给定一个整数数组 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
.
l
e
n
g
t
h
≤
30000
1 \le A.length \le 30000
1≤A.length≤30000
−
10000
≤
A
[
i
]
≤
10000
-10000 \le A[i] \le 10000
−10000≤A[i]≤10000
2
≤
K
≤
10000
2 \le K \le 10000
2≤K≤10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k
题解
对于求解区间和的整除问题,常用的就是用前缀和的取模来判断即
p
r
e
[
i
]
%
K
=
=
p
r
e
[
j
]
%
K
pre[i] \% K == pre[j]\%K
pre[i]%K==pre[j]%K
因此在区间 [ i + 1 , j ] [i+1,j] [i+1,j]内的和可以被 K K K整除。所以可以使用map来记录前缀和的模值。但是由于 2 ≤ K ≤ 10000 2\le K \le 10000 2≤K≤10000,所以可以使用数组表示。
func subarraysDivByK(A []int, K int) int {
n := len(A)
sum := 0
ans := 0
mp := make([]int,K)
mp[0] = 1
for i :=0;i<n;i++{
sum = ((sum +A[i])%K+K)%K
ans += mp[sum]
mp[sum] += 1
}
return ans
}