leetcode 974 整除K的子数组

从一个数组中,找出所有能整除K的非空的连续的子数组。

这个很容易想到前缀和+哈希表优化。这里会用到一个同余定理:如果两个数对K取模余数相同,则两数之差可以整除K。

public static int subarraysDivByK3(int[] A, int K) {
        int lenA = A.length;
        int[] pre = new int[lenA+1];
        //for(int i=0;i<lenA;i++){
        //    pre[i+1]=pre[i]+A[i];
        // }
        HashMap<Integer,Integer> record = new HashMap<>();
        record.put(0,1);
        int mod ;
        int ans = 0;
        int sum=0;
        for(int i=0;i<lenA;i++) {
            sum += A[i];
            mod = (sum % K + K) % K;
            if (record.containsKey(mod)) {
                ans += record.get(mod);
            }
            record.put(mod, record.getOrDefault(mod, 0) + 1);
        }
        return ans;
    }
View Code

还有就是对负数的取模运算。

mod = (sum % K + K) % K;

 

posted @ 2020-05-27 17:10  超级学渣渣  阅读(215)  评论(0编辑  收藏  举报