题目描述:给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
今日学习:
1.前缀和
2.同余
3.自建CA证书
每日参考小天使
首先要理解前缀和:前n项和
然后理解取余相同的前缀和相减就是目标子数组:
还要理解取余为0的时候初始化应该为1,因为只要取余为0就已经符合条件了,不需要有两个相同的相减
题解1:数组
```javascript
var subarraysDivByK = function(A, K) {
let map = new Array(K).fill(0)
map[0] = 1
let preSum = count = 0
for(let i = 0; i < A.length; i++) {
preSum = ((A[i] + preSum) % K + K) % K
count += map[preSum]
map[preSum]++
}
return count
};
```
题解2:map
```javascript
var subarraysDivByK = function(A, K) {
let map = { 0: 1 } // 为了让边界情况也能适用通式
let preSum = 0 // 保存前缀和模K的结果,初始值0
let count = 0 // 计数
for (let i = 0; i < A.length; i++) { // 一次遍历做完所有事
preSum = (preSum + A[i]) % K // 上一次的前缀和累加当前项,再mod
if (preSum < 0) preSum += K // 处理preSum为负数的情况,需要加 K
if (map[preSum]) { // 之前存过的 与当前preSum相等的key
count += map[preSum] // 把它出现的次数累加给count
}
if (map[preSum]) { // 以前存过,出现次数+1
map[preSum]++
} else { // 新存入,初始值1
map[preSum] = 1
}
}
return count // 返回计数结果
};
```