方法一:不用统计前缀和,只需要统计前i个数的余数就可以,若之前和的余数和当前和的余数相等则子数组可以整除K,遍历一遍即可
class Solution { public int subarraysDivByK(int[] A, int k) { int n = A.length; Map<Integer,Integer> map = new HashMap<>(); map.put(0,1); // 本身即可整除K的情况 int sum = 0, res = 0; for(int i = 0; i < n; i++) { sum += A[i]; int yu = (sum % k + k) % k; // 防止出现余数为负的情况 res += map.getOrDefault(yu,0); map.put(yu,map.getOrDefault(yu,0)+1); } return res; } }
数组优化:
class Solution { public int subarraysDivByK(int[] A, int k) { int n = A.length; int[] arr = new int[10000]; arr[0] = 1; // 本身即可整除K的情况 int sum = 0, res = 0; for(int i = 0; i < n; i++) { sum += A[i]; int yu = (sum % k + k) % k; // 防止出现余数为负数的情况 res += arr[yu]; arr[yu]++; } return res; } }