974. Subarray Sums Divisible by K

傳送門

問題分析

這個問題並不是我解出來的,所以直接翻譯其解析好了。
首先我們計算A的前綴和P
例如A = [4,5,0,-2,-3,1]則其前綴和爲P = [0,4,9,9,7,4,5]。之後我們再對前綴和進行取模運算,並記錄各個模結果的總數。
其結果爲C0 = 2,C2 = 1,C4 = 4。
對於C4 = 4,(位於P[1], P[2], P[3], P[5]),他指出有如下組合可以使得子序列和能夠被K整除,爲A[1: 2], A[1:3], A[1:5], A[2:3], A[2:5], A[3:5]。其爲無序排列組合的公式C62的值。
問題的最終答案爲C62 +C22

完整代碼


class Solution {
public:
    int subarraysDivByK(const vector<int>& A, int K) {
        vector<int> P(A.size() + 1, 0);
        vector<int> count(K, 0);
        int result{0};
        for(int i = 0; i < A.size(); i++)
            P[i + 1] = P[i] + A[i];
        for(auto v : P)
            count[((v % K) + K) % K]++;
        for(auto v : count)
            result += v * (v - 1) / 2;
        return result;
    } 
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章