一題算法|和可被 K 整除的子數組

題目

給定一個整數數組 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&emsp;一個餘數大小的數組
    int[] remainder = new int[K];
    // 默認有一個解
    remainder[0] = 1;
    // 餘數
    int mod = 0;
    // 求解個數
    int res = 0;
    for (int n: A) {
        mod = (mod + n) % K;
        // 若是餘數爲負數&emsp;咱們將餘數轉爲正餘數
        if (mod < 0) mod += K;
        res += remainder[mod];
        remainder[mod]++;
    }
    return res;
}
複製代碼

掃碼關注公衆號(搜索公衆號:平頭哥的技術博文)一塊兒交流學習唄

掃碼關注公衆號(搜索公衆號:平頭哥的技術博文)一塊兒交流學習唄
相關文章
相關標籤/搜索