ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法练习Day10 [LeetCode]974. 和可被 K 整除的子数组

2021-02-01 21:31:40  阅读:204  来源: 互联网

标签:取模 974 int 数能 说明 record Day10 整除 LeetCode


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

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

 

示例:
输入:A = [4,5,0,-2,-3,1], K = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
 

提示:
1. 1 <= A.length <= 30000
2. -10000 <= A[i] <= 10000
3. 2 <= K <= 10000


利用前缀和 + 哈希表的思路
设置一个以前缀和模 K后 的值为键,出现次数为值的哈希表 record,在遍历的同时进行更新,从排列组合的角度考虑子数组个数。注意的一个边界条件是,我们需要对哈希表初始化,记录record[0]=1,这样就考虑了前缀和本身被 K整除的情况。

举例说明
A = [4,5,0,-2,-3,1],K=5
前缀和 P = [4,9,9,7,4,5]
前缀和对K = 5取模 M = [4,4,4,2,4,0]
4对5取模等于4, 4加上一个数对5取模还等于4,说明什么?说明加上的这个数能被5整除。
M[0]和M[1]都等于4,说明A[1]这个数能被5整除。
M[0]和M[2]都等于4,说明A[1]+A[2]这个数能被5整除。
M[0]和M[4]都等于4,说明A[1]+A[2]+A[3]+A[4]这个数能被5整除。
M[1]和M[2]都等于4,说明A[2]这个数能被5整除。
M[1]和M[4]都等于4,说明A[2]+A[3]+A[4]这个数能被5整除。
M[2]和M[4]都等于4,说明A[3]+A[4]这个数这个数能被5整除。
则M中如果有4个4,说明A中有3+2+1个数可以被5整除。也就是4*(4-1)/2 个数可以被5整除。
推广开来,如果M中有m个x,说明A中有m*(m-1)/2个数可以被K整除。
特别地,如果M中有n个0,结果还要加上n,变为n + m*(m-1)/2。因为比如M[0]和M[1]都等于0,说明A[0]和A[1]都能被K整除。

class Solution {
    public int subarraysDivByK(int[] A, int K) {
        Map<Integer, Integer> record = new HashMap<>();
        record.put(0, 1);
        int sum = 0;
        for (int elem: A) {
            sum += elem;
            // 注意 Java 取模的特殊性,当被除数为负数时取模结果为负数,需要纠正
            int modulus = (sum % K + K) % K;
            record.put(modulus, record.getOrDefault(modulus, 0) + 1);
            //getOrDefault(key,defaultValue)方法:当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue
        }

        int ans = 0;
        //通过Map.entrySet遍历key和value
        for (Map.Entry<Integer, Integer> entry: record.entrySet()) {
            ans += entry.getValue() * (entry.getValue() - 1) / 2;
        }
        return ans;
    }
}

标签:取模,974,int,数能,说明,record,Day10,整除,LeetCode
来源: https://blog.csdn.net/weixin_39928544/article/details/113528817

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有