leetcode每日一题(2020-05-27):974. 和可被 K 整除的子数组

题目描述:给定一个整数数组 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 // 返回计数结果 }; ```
    posted @ 2020-05-27 12:35  秋夜星空  阅读(239)  评论(0编辑  收藏  举报