1. 程式人生 > >「Leetcode」974. Subarray Sums Divisible by K(Java)

「Leetcode」974. Subarray Sums Divisible by K(Java)

分析

這題場上字首和都想出來了,然後就沒有然後了。。。哭惹.jpg
字首和相減能夠得到任意一段連續區間的和,然後他們取餘\(K\)看餘數是否為0就能得到。這是樸素的遍歷演算法。那麼反過來說,如果兩個字首和都對\(K\)\(p\),那麼他們相減一定能夠被K整除。
我們就這麼統計就可以了,然後一個簡單的求和即可。想到不難,難的是想到。

程式碼

class Solution {
    public int subarraysDivByK(int[] A, int K) {
        int[] prefix = new int[A.length+1];
        for(int i=0; i<A.length; ++i)
        {
            prefix[i+1] = prefix[i] + A[i];
        }
        int[] cnt = new int[K];
        for(int p: prefix)
        {
            cnt[(p%K+K)%K]++;
        }
        int ans=0;
        for(int c: cnt)
        {
            ans += c*(c-1)/2;
        }
        return ans;
    }
}