这道题目描述很清晰,直接两层循环,代码如下:

 class Solution(object):
def subarraysDivByK(self, A: 'List[int]', K: int) -> int:
n = len(A)
totalnum = 0
for i in range(n):
cursum = 0
for j in range(i,n):
cursum += A[j]
if cursum % K == 0:
totalnum += 1 return totalnum

显然,时间复杂度O(n^2),这样会超时。

因此需要优化,把时间复杂度减少O(n),一般这种类型的题目,都是要从数学角度分析,寻找规律。

先贴代码:

 class Solution(object):
def subarraysDivByK(self, A: 'List[int]', K: int) -> int:
n = len(A)
totalnum = 0
preDic = dict()
cursum = 0
for i in range(n):
cur = A[i]
cursum += cur
res = cursum % K
if res == 0:
totalnum += 1
if res in preDic:
totalnum += preDic[res]
preDic[res] += 1
else:
preDic[res] = 1
return totalnum

这里比较关键的代码就是13~17行,对于前m项的连加和,模K的余数,如果是第一次出现,则在字典中进行“标记”。

如果不是第一次出现,则执行第14行代码,这看起来很奇怪。

那就使用实际的示例,调试代码来分析,测试用例是[4,5,0,-2,-3,1],K值为5。

当i==0时,A[i]的值是4,(res==4)因此preDic中增加{4:1}这一项,

当i==1时,A[i]的值是5,(res==4)这说明从上一次出现res==4,到本次出现res==4之间的区间,可能出现了0到x个K,x的值是多少呢?

恰好就是preDic[res]的值!

假设preDic[4] = 2,那么2这个值一般解读为:“余数为4的次数”。

也可以解读为:“到目前为止,已经出现了几次K的倍数,并且余数为4”。而这个次数,是等于数值-1。

即preDic[4] == 1时,表示第一次出现余数4,那么之前就有0次K的倍数。

predDic[4] == 2时,表示第二次出现余数4,那么之前就有1次K的倍数。因此才会有第14行:totalnum += preDic[res]。

leetcode974的更多相关文章

  1. [Swift]LeetCode974. 和可被 K 整除的子数组 | Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...

随机推荐

  1. java面试总躲不过的并发(一): 线程池ThreadPoolExecutor基础梳理

    本文核心:线程池ThreadPoolExecutor基础梳理 一.实现多线程的方式 1.继承Thread类,重写其run方法 2.实现Runnable接口,实现run方法 3.实现Callable接口 ...

  2. annotation的理解

    Annotations提供一些本来不属于程序的数据. 比如:一段代码的作者或者告诉编译器禁止一些特殊的错误.An annotation 对代码的执行没有什么影响.Annotations使用@annot ...

  3. CS萌新的汇编学习之路(其实是老师作业呵呵哒)Learning of Assembly Language

    第一节课学习汇编语言,做笔记,做笔记 1.概念 首先是汇编语言这门课程的定义以及对于学习高级语言.深入理解计算机系统的作用 软硬件接口机器语言 汇编语言 高级语言 关系 机器语言和汇编语言可移植性差 ...

  4. ffmpeg-4.1.1-win64-dev在vs2017的搭建

    没得话讲,先在官网下载对应的源码,下载dev/文件夹下的源码和静态链接库  ,下载/shared文件夹下的动态链接库 官网地址:https://ffmpeg.zeranoe.com/builds/wi ...

  5. C#使用Linq to Sqlite

    1.首先到Nuget命令行运行: Install-Package linq2db.SQLite 2.在项目下添加一个文件夹:DataModels,用以存放数据库相关的文件,显得规整 3.找到CopyM ...

  6. 京东饭粒捡漏V1.13

    20180629 更新 V1.131.解决下单异常问题:2.增加秒杀价格:3.增加购买数量: 功能介绍1.京东商城专用,支持饭粒模式下单,自己获得京豆返利 2.捡漏模式:帮助用户监控抢购商品,有库存的 ...

  7. 51nod1220 约数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1220 $G(n)=\sum\limits_{i=1}^n\sum\lim ...

  8. Win10 使用MinGW-w64编译Tesseract4.0

    一开始尝试使用mingw+msys编译tesseract, 但是苦于mingw-get安装的软件版本都太旧,要安装新版本只能下载源码编译安装. 在编译过程中遇到了很多麻烦,最后还遇到了包直接循环依赖问 ...

  9. C# 6.0:Exception Filter——带条件的异常处理

    C#6.0 对异常处理有两处改进,一个是在上一篇文章中我们讨论了的在catch和finally中使用await,另一个是exception filter.在catch和finally中使用await是 ...

  10. docker整理

    Docker的简单介绍 docker是什么 Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache ...