【Leetcode】974. Subarray Sums Divisible by K
阿新 • • 發佈:2021-01-19
技術標籤:# 棧、佇列、串及其他資料結構雜湊表hashmap雜湊leetcode
題目地址:
https://leetcode.com/problems/subarray-sums-divisible-by-k/
給定一個長 n n n的陣列 A A A,再給定一個大於 1 1 1的正整數 k k k,問其有多少個非空子陣列和是 k k k的倍數。
求一下
A
A
A的字首和模
k
k
k陣列
c
c
c,即
c
[
i
]
=
(
∑
k
=
0
i
−
1
A
[
k
]
)
m
o
d
k
c[i]=(\sum_{k=0}^{i-1}A[k])\mod k
c[i]=(∑k=0i−1A[ k])modk,接著遍歷
c
c
c,並開一個雜湊表,key是模
k
k
k的值,value是模
k
k
k的值是key的字首有多少個。這樣遍歷到
c
[
i
]
c[i]
c[i]的時候,查一下雜湊表key為
c
[
i
]
c[i]
c[i]的value,就知道了以
A
[
i
−
1
]
A[i-1]
A[i−1]為右端點的和是
k
k
k的倍數的子陣列有多少個了,累加即可。程式碼如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int subarraysDivByK (int[] A, int K) {
int res = 0;
Map<Integer, Integer> map = new HashMap<>();
// 空陣列對應的字首和是0,要累加進去
map.put(0, 1);
for (int i = 0, preSum = 0; i < A.length; i++) {
preSum = (preSum + A[i] % K + K) % K;
res += map.getOrDefault (preSum, 0);
map.put(preSum, map.getOrDefault(preSum, 0) + 1);
}
return res;
}
}
時間複雜度 O ( n ) O(n) O(n),空間 O ( k ) O(k) O(k)。