刚开始用前缀和的方法试试,会超时

class Solution {public:int subarraysDivByK(vector<int>& nums, int k) {int size = nums.size();vector<int> preSum(size + 1, 0);for (int i = 1; i <= size; i++)preSum[i] = preSum[i - 1] + nums[i - 1];int cnt = 0;for (int i = 1; i <= size; i++)for (int j = 0; j < i; j++)if ((preSum[i] - preSum[j]) % k == 0)cnt++;return cnt;}
};

然后和【中等】和为K的子数组一样,也用散列表优化

class Solution {private:map<int, int> mp;
public:int subarraysDivByK(vector<int>& nums, int k) {int sum = 0, cnt = 0;mp[0] = 1;for (int i = 0; i < nums.size(); i++){sum += nums[i];int n = (sum % k + k) % k;//(sum % k + k) % k防止出现下标为负数的情况if (mp[n] > 0)cnt += mp[n];mp[n]++;}return cnt;}
};

用例子讲解一下我做这题的思路(思维比较发散,想到哪说到哪)
A = [4,5,0,-2,-3,1], K = 5
累加和对k求余,如果求到的余数出现过,那么一定可以在能求出这个余数的一个数或一串数后面找到和是k的倍数的子串。
比如[4, 1, 2, 2],和为9,对5求余得4,可以求出余数是4的数就是第一个4,而这个数后面一定能找到的和为5的子串[1, 2, 2]。(可以求出余数是4的要么是第一个数,要么是前面的一串数,所以得到和为5的子串一定会在第一个数或一串数后面,一定是连续的)
举个小例子细讲
a = [4, 5, 0] k = 5
第一个数得到余数4,mp[4] = 1。
然后4+5得9,9的余数是4,而mp[4]=1表明4出现过了,说明5一定可以被k整除,cnt += mp[4], 结果为1。
之后mp[4]会加1,原因是如果加上后面的数求余之后也是4,说明自己也能被k整除。但是别忘了,5能被k整除,自己也能被k整除,自然5和我加起来也能被k整除,所以加1是为了这个。
说来就来,0还正好能被5整除,所以此时cnt += mp[4]后cnt就是3了,包括了三种情况。
然后mp[4]会再再加1,原因再说一遍:如果加上0后面的数x后求余还是4,说明[5]、[0]、[x]、[5, 0]、[0, x]、[5, 0, x]都能被k整除,cnt加上mp[4]后就变成了6,包括了这6种情况

【中等】和可被K整除的子数组相关推荐

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

    这几天力扣总算是放我这个菜鸡一马,来了一些中等难度题.和可被K整除的子数组,一看到反正最近脑子里都是双指针.滑动窗.前缀和.动态规划之类的东西.话不多说,赶紧看一看今天的题. 974.和可被K整除的子 ...

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

    974. 和可被 K 整除的子数组 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解 ...

  3. ⭐算法入门⭐《前缀和》中等02 —— LeetCode 974. 和可被 K 整除的子数组

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 1)初始化前缀和 2)哈希表统计 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题 ...

  4. Leetcode题解974 能被和可被 K 整除的子数组

    给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续.非空) 子数组 的数目. 子数组 是数组的 连续 部分. 难度:Hard 此题是前缀和的经典应用题的一个变形 如果 ...

  5. LeetCode 刷题系列(前缀和题目)之 974. 和可被 K 整除的子数组

    题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续.非空) 子数组 的数目. 子数组 是数组的 连续 部分. 示例 1: 输入:nums = [4,5,0,- ...

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

    给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元素之和 ...

  7. leetcode *974. 和可被 K 整除的子数组(2020.5.27)

    [题目]*974. 和可被 K 整除的子数组 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输 ...

  8. leetcode 974. 和可被 K 整除的子数组(C++)

    给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元素之和 ...

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

    题目链接 本来我以为这又是一道常见的前缀和,直到连续两个负数的错误样例让我意识到还是要谨慎. 关键点 如果两个前缀和同余,证明其中间的数和为K的倍数. 记录book[0]=1,这样就考虑了前缀和本身被 ...

最新文章

  1. 双击.exe文件出现Debug Error: abort() has been called解决办法(之一)
  2. 腾讯Android自动化测试实战3.3.2 ListView列表遍历
  3. 阿里25k招.NET,要求WPF!
  4. hazelcast_Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
  5. Taro+react开发(24)--this.state和this.props
  6. javascript时间戳和日期字符串相互转换
  7. ​【文末有福利】连续型随机变量及实例详解
  8. Qt5.6.0+OpenGL 纹理贴图首战告捷
  9. java编程计算加减乘除_Java程序完成加减乘除四则运算
  10. Java 1.1.6 码点与码点单元(回)
  11. 某大型银行深化系统技术方案之十二:服务层之服务分类
  12. ASP.NET 4.0事件消息: 发生了验证错误;检测到有潜在危险的 Request.Form 值。
  13. 研磨设计模式学习笔记1--简单工厂(SimpleFactory)
  14. 计算机二级公共基础知识笔记
  15. 基于MATLAB的指纹识别算法仿真实现
  16. 让架构接地气,不再云里雾里
  17. php实现12306验证码,PHP仿12306点图验证码
  18. linux系统 用优盘启动流程,制作u盘启动linux系统
  19. 福师计算机应用基础在线作业,福师《计算机应用基础》在线作业一
  20. java List/ArrayList 解惑

热门文章

  1. Nginx 性能优化 Gzip 压缩配置
  2. 集合,ArrayList,LinkedList,HashMap,LinkedHashMap,ConcurremtHashMap分别的总结,volatile 关键字的使用
  3. [NOIP2003] 提高组 洛谷P1039 侦探推理
  4. 一键中文数据增强包 ; NLP数据增强、bert数据增强、EDA:pip install nlpcda
  5. 董氏奇穴学习记录(上课记录)
  6. 「 运动控制 」判断二阶微分方程稳定性的方法
  7. android棉花糖,Android-6.0 棉花糖权限的那点事
  8. h5页面在新版微信iOS 端出现底部白色导航条
  9. java 算出下一个工作日_Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)...
  10. Chromium为视频标签video全屏播放的过程分析