和可被 K 整除的子数组

题目描述:


和可被 K 整除的子数组
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000


输入示例:

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]

题目分析:


这道题呢,求可被K整除的连续子数组的数目,第一反应就是先求出前缀和,前缀和相减即为区间和,区间和对K取模为0,则ret++。这个思路没问题,但是会超时....然后再观察一下前缀和,我们可以发现对前缀和取模后,如果两个前缀和相等,那么这个区间一定是符合要求的,所以统计前缀和次数,然后排列组合。具体代码如下~


代码实现:

class Solution {
    public int subarraysDivByK(int[] A, int K) {
        int[] countSum=new int[K];
        int sum=0;
        countSum[0]=1;
        for(int i=0;i<A.length;i++){
            sum=((sum+A[i])%K+K)%K;
            countSum[sum]++;
        }
        int ret=0;
        for(int i=0;i<K;i++){
            ret+=(countSum[i]*(countSum[i]-1))/2;
        }
        return ret;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。