Title

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

提示:

1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000

Solve

暴力

暴力的方法当然是最好想也是最好实现的,可惜会超时:

def subarraysDivByK_violence(self, A: List[int], K: int) -> int:ans = 0for i in range(len(A)):for j in range(i + 1, len(A) + 1):if sum(A[i:j]) % K == 0:ans += 1return ans

前缀和

一看到子数组和,马上就得想到用“前缀和”。

先来看一下什么是前缀和:从数组第0项到当前项的总和
如果用一个数组preSum表示:

  • preSum[0]:数组A 第 0 项 到 第 0 项 的总和
  • preSum[1]:数组A 第 0 项 到 第 1 项 的总和
  • preSum[2]:数组A 第 0 项 到 第 2 项 的总和
  • ……

于是有:preSum[i]=A[0]+A[1]+…+A[i]preSum[i]=A[0]+A[1]+…+A[i]preSum[i]=A[0]+A[1]+…+A[i]
所以有:A[i]=preSum[i]−preSum[i−1]A[i]=preSum[i]−preSum[i−1]A[i]=preSum[i]−preSum[i−1]
可推出:A[i]+…+A[j]=preSum[j]−preSum[i−1]A[i]+…+A[j]=preSum[j]−preSum[i−1]A[i]+…+A[j]=preSum[j]−preSum[i−1]
考虑边界情况,当i=0时,i-1=-1,让preSum[-1]=0,可得:A[0]+A[1]+…+A[j]=preSum[j]A[0]+A[1]+…+A[j]=preSum[j]A[0]+A[1]+…+A[j]=preSum[j]
这样可以让边界情况也能套用通式。

题目中说的子数组的元素之和,就是数组第i项到第j项的和。

求子元素之和能被K整除的子数组数目,等价于求有几种i,j组合,使得i~j项的和mod K == 0,即满足(preSum[j]−preSum[i−1])modK==0(preSum[j]−preSum[i−1])modK==0(preSum[j]−preSum[i−1])modK==0等价于pre[j]modK==pre[i−1]modKpre[j]modK==pre[i−1]modKpre[j]modK==pre[i−1]modK


  1. preSum 数组的每一项,怎么求?

    • 前一项的前缀和+当前项=当前项的前缀和
    • 求出preSum数组项让它mod K,mod完看哪两项相等,统计次数
    • 通式有i,j两个变量,找出所有相等的两项,需要两层循环
  2. 引入哈希表

    • 不关心前缀和对应数据A的哪一项,即不关心具体位置
    • 关系出现过哪些前缀和%K的结果和对应的次数
    • 用一个变量preSum,保存每次求出的前缀和%K,存入哈希表
      • key:前缀和%K,数值作为key
      • value:这个结果出现了几次

流程梳理

  1. 预置边界情况:map提前放入0:1,代表前缀和mod K == 0已经出现过1次
  2. 遍历数据A的每一项,求当前项的前缀和mod K,存入map中
    • 如果之前没有存过,则作为key存入,值为1
    • 如果之前已经存过,则对应的值+1(说明存在之前求出的前缀和,它mod K==当前前缀和 mod K,将之前求出的前缀和 mod K出现的次数累加给ans)

复杂度分析

时间复杂度:O(n)
空间复杂度:O(K)

Code

def subarraysDivByK(self, A: List[int], K: int) -> int:ans, preSum, modKMap = 0, 0, {0: 1}for i in range(len(A)):preSum = (preSum + A[i]) % K# 因为负数取模还是负数,所以需要加 Kif preSum < 0:preSum += Kif modKMap.get(preSum, None):ans += modKMap[preSum]modKMap[preSum] += 1else:modKMap[preSum] = 1return ans

974. Subarray Sums Divisible by K相关推荐

  1. leetcode 974. Subarray Sums Divisible by K

    974. Subarray Sums Divisible by K 题意:给你一个数组A和一个数K,求改数组有多少连续子序列的和能被K整除. 思路:简单DP.假设sum[i]表示[0-i]的求和,那么 ...

  2. leetcode 974 Subarray Sums Divisible by K

    leetcode 974 Subarray Sums Divisible by K 1.题目描述 2.解题思路 3.Python代码 1.题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除 ...

  3. 【leetcode】974. Subarray Sums Divisible by K

    题目如下: Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have ...

  4. LeetCode:974. Subarray Sums Divisible by K - Python

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

  5. 974. Subarray Sums Divisible by K [Medium]

    用了prefix sum的思想,之前没用过,感觉很难 /*** Runtime: 18 ms, faster than 56.05%* Memory Usage: 42.9 MB, less than ...

  6. leetcode 974. Subarray Sums Divisible by K的解法(统计共同余数)

    题目大意:给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目 大致思路:比如数组A = [1,2,1], K=2,那么1%2 =1,(1+2)%2=1,所以 {2}是符合 ...

  7. LeetCode 974. Subarray Sums Divisible by K--Python解法--数学题--取模求余

    LeetCode 974. Subarray Sums Divisible by K–Python解法–数学题–取模求余 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结 ...

  8. 【LeetCode】713. Subarray Product Less Than K 乘积小于 K 的子数组

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 文章目录 题目描述 题目大意 解题方法 滑动窗口 复杂度 分享滑动窗口模板 总结 日期 ...

  9. 713. Subarray Product Less Than K

    1.题目描述 输入数组(positive)和一个k,求数组中有多少个subarray乘积是小于k的. 2.思路 碰到subarray问题,有几个方案: 1.动归[求连续最大什么的] 2.two poi ...

最新文章

  1. thymeleaf引用图片_SpringBoot访问静态资源(图片、html)以及整合thymeleaf 注意点
  2. 年末回顾:2021年 AI 领域十大研究趋势及必读论文
  3. 关于运行robot framework 报错解决方法,ModuleNotFoundError: No module named 'robot'
  4. Spring Task配置
  5. yolov2移植到android,darknet(yolov2)移植到caffe框架
  6. Linux系统更新最新版R语言方法
  7. 未来计算机作文1000字,未来的生活作文1000字
  8. 段钢荣获 WIT Awards 2018 年度安全人物|FIT 2019
  9. 潍坊学院c语言上机题库,参编学校_C语言程序设计上机指导与同步训练(刘迎春、张艳霞)_pdf_大学课件预览_高等教育资讯网...
  10. android fake gps,假GPS定位(Fake GPS Position) v4.5 安卓版
  11. DevExpress Office文件API打印 PDF 文档
  12. webstack开源网站导航源码
  13. 《三级医院评审标准(2020年版)》及解读:医疗机构要不断加强信息化建设
  14. 分享:git push 时报错 Permission to username/My_python.git denied to deploy key 解决方法
  15. [gitHub使用笔记一]ubuntu下快速访问github官网的方法
  16. 用python计算邮费考虑是否加急,用python计算residuals
  17. 反向传播算法推导、激活函数、梯度消失与爆炸
  18. 研发效能度量的正确姿势与落地实践(演讲PPT分享版)
  19. C语言编程实现冰雹猜想的算法,并测算各个自然数到达4-2-1谷底(即N等于4,2,1结束后)所经过的变换次数。
  20. 威联通架设php网站_PHP个人网站架设全攻略_PHP

热门文章

  1. python——函数 10、函数的嵌套
  2. 『Linux基础 - 4 』linux常用命令(1)
  3. 饲料企业精细化生产管理方案
  4. ASP中 Request.Form中文乱码的解决方法
  5. php多线程解决之stream_socket_client
  6. html逻辑判断符,JavaScript中的逻辑判断符、||与!介绍
  7. python解析树_如何使用python中的stanford解析器获取树的叶子?
  8. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
  9. python产品缺陷_基于python从redmine-api中获取项目缺陷数据(1)
  10. 计算机专业期末考试是编程序,武汉大学计算机学院C语言期末考试