题目

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

示例 1:

输入:nums = [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]
示例 2:

输入: nums = [5], k = 9
输出: 0

提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
2 <= k <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sums-divisible-by-k

思路:

此题思路与 560 题思路大体一致。子数组 nums[i], ..., nums[j] 的和 sum_i_j = sum_j - sum_i。 若是想满足 元素之和可被 k 整除 ,则有 sum_i_j % k == 0, 即 (sum_j - sum_i)%k == 0, 即 sum_j % k - sum_i % k = 0, sum_j % k == sum_i % k。

class Solution {public int subarraysDivByK(int[] nums, int k) {int count = 0;Map<Integer, Integer> map = new HashMap<>(); // key=从index 0 到 index j的子数组的元素和 % k 后的值,value = key出现的次数,0 <= j < nums.lengthmap.put(0, 1);  // 满足 nums[0] % target == 0  时的 caseint sum_j = 0;for (int j = 0; j < nums.length; j++) {sum_j += nums[j];// 注意 C++/Java 取模的特殊性,当被除数为负数时取模结果为负数,需要纠正int key = (sum_j % k + k) % k;map.put(key, map.getOrDefault(key, 0) + 1);}for (Map.Entry<Integer, Integer> entry : map.entrySet()) {int size = entry.getValue();count += size * (size-1)/2;}return count;}
}

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

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

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

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

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

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

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

  4. Leetcode学习笔记(974. 和可被 K 整除的子数组)

    前缀和,注意c++取模被除数为负数情况,要进行调整: class Solution {public:int subarraysDivByK(vector<int>& A, int ...

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

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

  6. Leetcode刷题指南和top100题目

    原文链接:https://blog.csdn.net/qq_39521554/article/details/79160815 参考博文:https://blog.csdn.net/mmc2015/a ...

  7. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  8. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

  9. Leetcode刷题系列(一)——巧解数学问题

    文章目录 1.引言 2.最大公约数与最小公倍数 2.1最大公约数 2.2最小公倍数 3.筛法和打表 4.进制转换 5.角度问题(1rad=180°/π) 6.同余定理 7.容斥原理 8.距离度量公式 ...

最新文章

  1. 华硕路由器安装aria2_网易UU加速器联动华硕,瞄准主机玩家联网刚需
  2. pbar PermissionError
  3. git报错:remote: warning: Large files detected.
  4. python人工智能-马哥教育官网-专业Linux培训班,Python培训机构
  5. Bash命令行历史用法【转】
  6. xieshiran:使用 R 语言开发评分卡模型
  7. 05-JDBC学习手册:JDBC2.0 新特性之批量处理数据
  8. figma下载_不用担心Figma中的间距
  9. python存储和读取数据时出现错误_python读取json文件存sql及codecs读取大文件问题...
  10. iPhone用户注意!苹果:手机丢失这么做 官方售后拒绝维修
  11. Kubernetes学习总结(10)—— 何为云原生,与 kubernetes 是什么关系
  12. graphicsmagick常用命令
  13. 如何在C#窗体中定义全局变量
  14. Flink Next:Beyond Stream Processing
  15. [Linux] sed编辑器
  16. MATLAB--求解矩阵方程
  17. MATLAB+三对角矩阵
  18. WiFi模块 driver驱动框架(sdio接口、pcie接口)
  19. LINUX中ECHO命令的使用
  20. 学校创客教育实施方案

热门文章

  1. 计算机病毒手动查杀,手动查杀电脑病毒的一些基本方法
  2. 计算机病毒辽师大教案,2019年四年级信息技术下册 第二课 计算机病毒知识二教案 辽师大版.doc...
  3. SpringMVC IP权限设计
  4. 示波器直流增益|通道隔离度|带宽|时基|瞬态响应校准软件NSAT-3010
  5. leetcode每天5题-Day12
  6. 释放数据生产力 我们该如何思考、如何行动?
  7. python三个点是什么意思_Python 3 中 ... 三个点的省略号的作用
  8. 币圈“杀熟”远比你想象的严重 ,99%的亏损是被身边人所带
  9. 为TreeView正色
  10. Java 学生信息管理系统 (mysql版)