ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-16 13:02:07  阅读:212  来源: 互联网

标签:974 前缀 int 数组 余数 整除 HashMap


题目

给定一个整数数组 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]

前缀和+HashMap

常规思路是:首先求得前缀和数组,然后检查每一个子数组的和是否能被K整除。这样做的时间复杂度是O(n^2),会超时,需要继续优化。优化的思路是不用检查每个子数组,而是能快速找到和能被K整除的数组。可以使用HashMap,前缀和sum[i]除以K的余数为key,该余数出现的次数为value,如果有两个余数相同的前缀和,那么它们对应的区间和就能被K整除。遍历数组,依次将对应的entry加入HashMap,记当前位置的前缀和除以K的余数为r,则前面有多少个对应前缀和余数同为r的位置,则符合条件的子数组就新增几个。
需要注意的是两个前缀和相减对应的区间不能从下标0开始,如果当前位置的sum[i]刚好就能被K整除,则符合条件的子数组个数加1。

class Solution {
    public int subarraysDivByK(int[] A, int K) {
        int count=0,n=A.length,s=0;
        int[] sum=new int[n];
        for(int i=0;i<n;++i){
            s+=A[i];
            sum[i]=s;
        } 
        int r=0;//r为余数
        //key为sum[i]除以K的余数,value为该余数出现的次数
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<n;++i){
            r=(sum[i]%K+K)%K;//防止余数为负数
            if(r==0) count+=1;//如果sum[i]可以被K整除,count加1

            if(map.containsKey(r)){
                count+=map.get(r);
                map.put(r,map.get(r)+1);
            }
            else map.put(r,1);
        }
        return count;
    }
}

原题链接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k

标签:974,前缀,int,数组,余数,整除,HashMap
来源: https://www.cnblogs.com/Frank-Hong/p/14175979.html

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

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

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

ICode9版权所有