Given an array A
of integers, return the number of (contiguous, non-empty) subarrays that have a sum divisible by K
.
Example 1:
Input: A = [4,5,0,-2,-3,1], K = 5 Output: 7 Explanation: There are 7 subarrays with a sum divisible by K = 5: [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
Note:
1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000
和可被 K 整除的子数组。题意跟560题很接近,唯一不同的地方在于这个题找的是可以被K整除的子数组,需要判断前缀和是否能%K。依然是前缀和的思路做,需要注意的是当前缀和为负数的时候,需要将其不断加K使其变成正数之后再放入hashmap,否则结果就是错的。举个例子,如果前缀和是-1,K = 5的话,需要将前缀和 + 5 = 4,这样余数是4而不是-1。根据同余定理得知,当某两个前缀和%K的结果相同的时候,他们之间的子数组的和就一定能被K整除。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public int subarraysDivByK(int[] A, int K) { 3 int res = 0; 4 int sum = 0; 5 Map<Integer, Integer> map = new HashMap<>(); 6 map.put(0, 1); 7 for (int a : A) { 8 sum = (sum + a) % K; 9 if (sum < 0) { 10 sum += K; 11 } 12 res += map.getOrDefault(sum, 0); 13 map.put(sum, map.getOrDefault(sum, 0) + 1); 14 } 15 return res; 16 } 17 }