Leetcode 974. 和可被 K 整除的子數組【前綴和+同餘定理+負數處理】

問題描述

給定一個整數數組 A,返回其中元素之和可被 K 整除的(連續、非空)子數組的數目。

示例:

輸入: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]

解題報告

這道題和 Leetcode 523. 連續的子數組和【前綴和+同餘定理】 挺相似的,但是 Leetcode 523 數組中元素非負,而這道題,正負數都有。

同餘定理中,preSum[j]-preSum[i]%k==0->preSum[i]%k==preSum[j]%k,這裏要求 preSum[i]preSum[j] 均爲正整數。

當其中存在負數時,需要將等式變換一下。preSum[j]-preSum[i]==0->(preSum[j]%k+k)%k==(preSum[i]%k+k)%k

preSum[j] 爲正整數時,preSum[j]%k 取爲本身的值;當 preSum[j] 爲負整數時,preSum[j]%k則應該取爲 preSum[j]%k+k,爲了統一形式,取爲 (preSum[j]%k+k)%k

實現代碼0z

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {        
        int sum=0,ans=0;
        unordered_map<int,int> mp;
        mp[0]=1;
        for(int i=0;i<nums.size();i++){
            sum=((nums[i]+sum)%k+k)%k;
            ans+=mp[sum]++;
        }
        return ans;
    }
};

參考資料

[1] Leetcode 974. 和可被 K 整除的子數組

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