leetcode五月每日一題 leetcode974

在這裏插入圖片描述
一般涉及連續子數組的問題都用前綴和來表示
前綴和及爲:(圖來自leetcode官方題解)
在這裏插入圖片描述
所以我們掃描這個整數數組A,
維護一個哈希表:鍵:前綴和模 K 的值,值:出現次數
則每一個前綴和的符合要求的子數組個數及爲,哈希表中鍵所對應值所顯示的個數(注意的是,這裏鍵所對應的值爲1也是可以的,因爲此時有一個子數組)

然後將這些值相加,就是最終子數組的個數

class Solution {
public:
    int subarraysDivByK(vector<int>& A, int K) {
        unordered_map<int, int> record = {{0, 1}};
        int sum = 0, ans = 0;
        for (int elem: A) {
            sum += elem;
            // 注意 C++ 取模的特殊性,當被除數爲負數時取模結果爲負數,需要糾正
            int modulus = (sum % K + K) % K;
            if (record.count(modulus)) {
                ans += record[modulus];
            }
            ++record[modulus];
        }
        return ans;
    }
};


最近有點飄了,明天一定要恢復到狀態!!!

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