給定一個整數數組 A,返回其中元素之和可被 K 整除的(連續、非空)子數組的數目java
輸入 :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]
複製代碼
利用雙循環將全部可能的連續子數組枚舉出來,求出子數組的和
sum
,如sum
能夠整除K,則解法數+1。數組
定於一個默認爲零的餘數
mod
,遍歷數組,餘數mod
與數組的值求和除於K得出新的餘數餘數mod
,每出現一次餘數mod
,則remainder[mod]
的值+1,由於餘數每出現一次說明存在一個解。學習
/** * 暴力解法,枚舉全部連續數組的結果 * @param A * @param K */
public static int forSolution(int[] A, int K) {
int res = 0;
for (int i = 0; i < A.length; i++) {
int sum = A[i];
if (sum % K == 0) ++res;
for (int j = i + 1; j < A.length; j++) {
sum += A[j];
// 被K整除
if (sum % K == 0) ++res;
}
}
return res;
}
複製代碼
/** * 同餘定理 * @param A * @param K * @return */
public static int remainder(int[] A, int K) {
// 新new 一個餘數大小的數組
int[] remainder = new int[K];
// 默認有一個解
remainder[0] = 1;
// 餘數
int mod = 0;
// 求解個數
int res = 0;
for (int n: A) {
mod = (mod + n) % K;
// 若是餘數爲負數 咱們將餘數轉爲正餘數
if (mod < 0) mod += K;
res += remainder[mod];
remainder[mod]++;
}
return res;
}
複製代碼