【LEETCODE】974. 和可被 K 整除的子數組

題目

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

思路

  1. 涉及連續子數組的問題,考慮使用前綴和解決問題。即存儲A[0]至當前數組項的和sum
  2. 本題中,(A[j]-A[i])%K==0時,表示該區間爲符合條件的子數組,即A[j]和A[i]有相同的餘數。

=>根據上述分析將該題轉化爲:查找當前數組所有前綴和餘數相同的項目。

代碼

class Solution {
    public int subarraysDivByK(int[] A, int K) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0,1);//當第一次remainder=0時,ans+1
        int sum=0, ans=0;
        for(int i:A){
            sum+=i;
            int remainder = (sum%K+K)%K;//考慮負數情況,糾正模值爲正數
            int num = map.getOrDefault(remainder,0);
            ans+=num;
            map.put(remainder,num+1);
        }
        return ans;
    }
}

複雜度分析

  1. 時間複雜度:O(n)
  2. 空間複雜度:O(min(N,K)),其中N爲數組長度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章