1. 程式人生 > 其它 >【Leetcode】974. Subarray Sums Divisible by K

【Leetcode】974. Subarray Sums Divisible by K

技術標籤:# 棧、佇列、串及其他資料結構雜湊表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=0i1A[

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[i1]為右端點的和是 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)