给定一个整数数组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结果:
更多题解移步公众号免费获取