leetcode 974 整除K的子数组
从一个数组中,找出所有能整除K的非空的连续的子数组。
这个很容易想到前缀和+哈希表优化。这里会用到一个同余定理:如果两个数对K取模余数相同,则两数之差可以整除K。
public static int subarraysDivByK3(int[] A, int K) { int lenA = A.length; int[] pre = new int[lenA+1]; //for(int i=0;i<lenA;i++){ // pre[i+1]=pre[i]+A[i]; // } HashMap<Integer,Integer> record = new HashMap<>(); record.put(0,1); int mod ; int ans = 0; int sum=0; for(int i=0;i<lenA;i++) { sum += A[i]; mod = (sum % K + K) % K; if (record.containsKey(mod)) { ans += record.get(mod); } record.put(mod, record.getOrDefault(mod, 0) + 1); } return ans; }
还有就是对负数的取模运算。
mod = (sum % K + K) % K;