題目
給定一個整數數組 A,返回其中元素之和可被 K 整除的(連續、非空)子數組的數目。
思路
- 涉及連續子數組的問題,考慮使用前綴和解決問題。即存儲A[0]至當前數組項的和
sum
。 - 本題中,
(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;
}
}
複雜度分析
- 時間複雜度:O(n)
- 空間複雜度:O(min(N,K)),其中N爲數組長度。