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

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

 

题解:

1.整数数组

2.有连续非空子数组元素和能被K整除

3.计算这样的子数组数目

 

示例:

输入: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 <= A.length <= 30000

-10000 <= A[i] <= 10000

2 <= K <= 10000

 

解题思路:560. 和为K的子数组

  • 560. 和为K的子数组内容基本一致;区别是判断和为K还是被K整除

  • 注意负整数对K取余的影响,在判断能否被K整除时,令余数=(sum%

    K+K)%K;

  • 判断余数是否在map中出现过,若是将对应的value计入个数中

  • 560. 和为K的子数组是以和为key,这里被K整除,以余数为key

  • 对余数为key的value增1,实现记录个数

C/C++题解:

class Solution {

public:

    int subarraysDivByK(vector<int>& A, int K) {

        unordered_map<int, int> mp = {{0, 1}};

        int num=0,count = 0;

        for(int x:A){

            num += x; //计数和

            int moud = (num%K + K)%K; //元素和对K取余,为0则整除

            if (mp.count(moud)) {//余数作为key若存在

                count += mp[moud];//计数个数

            }//<余数,个数>记录到map中

            mp[moud] += 1;}

        return count;}};//满足条件的子数组个数

Debug结果:

Java题解:

class Solution {

    public int subarraysDivByK(int[] A, int K) {

        int num=0,count = 0;

        HashMap<Integer,Integer> mp = new HashMap<>();

        mp.put(0,1);

        for(int x:A){

            num += x; //计数和

            int moud = (num%K + K)%K; //元素和对K取余,为0则整除

            if(mp.containsKey(moud)){//余数作为key若存在

                count += mp.get(moud);//计数个数

            }//<余数,个数>记录到map中

            mp.put(moud, mp.getOrDefault(moud, 0)+1); }

        return count;}} //满足条件的子数组个数

Debug结果:

Python题解:

class Solution(object):

    def subarraysDivByK(self, A, K):

        """:type A: List[int]:typeK:int:rtype:int"""

        num, count, mp = 0, 0, {}

        mp[0] = 1

        for x in A:

            num += x #计数和

            moud = (num%K+K)%K #元素和对K取余,为0则整除

            if moud in mp:  #余数作为key若存在

                count += mp[moud] #计数个数

            if moud not in mp:

                mp[moud] = 0 #<余数,个数>记录到map中

            mp[moud] += 1

        return count #满足条件的子数组个数

Debug结果:

更多题解移步公众号免费获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值