974. 和可被 K 整除的子数组

 

 方法一:不用统计前缀和,只需要统计前i个数的余数就可以,若之前和的余数和当前和的余数相等则子数组可以整除K,遍历一遍即可

class Solution {
    public int subarraysDivByK(int[] A, int k) {
        int n = A.length;   
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);  // 本身即可整除K的情况
        int sum = 0, res = 0;
        for(int i = 0; i < n; i++) {
            sum += A[i];
            int yu = (sum % k + k) % k; // 防止出现余数为负的情况
            res += map.getOrDefault(yu,0);
            map.put(yu,map.getOrDefault(yu,0)+1);
        }
        return res;
    }
}

数组优化:

class Solution {
    public int subarraysDivByK(int[] A, int k) {
        int n = A.length;   
        int[] arr = new int[10000];
        arr[0] = 1;  // 本身即可整除K的情况
        int sum = 0, res = 0;
        for(int i = 0; i < n; i++) {
            sum += A[i];
            int yu = (sum % k + k) % k; // 防止出现余数为负数的情况
            res += arr[yu];
            arr[yu]++;
        }
        return res;
    }
}

 

posted @ 2020-07-15 20:13  Sexyomaru  阅读(122)  评论(0编辑  收藏  举报