python 整除的数组_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的子数组内容基本一致;区别是判断和为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& A, int K) {

unordered_map 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 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、付费专栏及课程。

余额充值