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

给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

数组

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        int[] positive = new int[k + 1];
        int[] negative = new int[k + 1];
        positive[0] = negative[0] = 1;
        int sum = 0;
        int ans = 0;
        for (int num : nums) {
            sum = (sum + num) % k;
            if (sum >= 0) {
                ans += positive[sum]++ + negative[k - sum];
            } else {
                ans += negative[-sum]++ + positive[k + sum];
            }
        }
        return ans;
    }
}

哈希表

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer, Integer> dp = new HashMap<Integer, Integer>() {{
            put(0, 1);
        }};
        int sum = 0;
        int ans = 0;
        for (int num : nums) {
            sum = ((sum + num) % k + k) % k;
            int cnt = dp.getOrDefault(sum, 0);
            ans += cnt;
            dp.put(sum, cnt + 1);
        }
        return ans;
    }
}
上一篇:UVA10391 UVA10391 复合词 Compound Words 题解


下一篇:单调约束