题目

给定一个整数数组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. 同余定理:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。
  2. 前缀和:【前缀和】974 和可被K整除的子数组
  3. 题目等价为:有几种组合满足(preSum【j】-preSum【i-1】)modK0.即preSum【j】modKpreSum【i-1】modK
  4. 前一项的前缀和累加当前项就是当前项的前缀和。找出所有相等的i j两项,需要两层循环。因此使用哈希表
  5. key:前缀和modk的值。value:这个结果值出现了几次。
  6. 过程:计算当前前缀和modk的值,如果之前没有存过则作为key存入值为1,如果存过则count+1.最后返回count。
  7. 实际找出a[j]%K和a[i]%K(即两者同余于KKK)相等的即可!即是每一段前缀和modk的值,找出相等的,那么这两段的子数组就是要求的范围。
  8. 注意:
    初始record【0】为1,是因为其他数字都需要至少两个才可以。但是0需要一个就可以。因此提前设置成1。(本身目的是要找相等的两个值,计算其中的子数组的值。但是等于0的话就本身算一个。不要寻找第二个相等的数组。)
    map.getOrDefault方法:如果原始集合中有key时,就使用原始的key,没有就用默认值
    当和为负数时,需要加k
    (sum % K + K) % K——当和为负数时做的调整。也可以+k,另外做一个调整。

代码实现

【前缀和】974 和可被K整除的子数组

参考

974解析

相关文章: