leetcode974
这道题目描述很清晰,直接两层循环,代码如下:
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的更多相关文章
- [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 ...
随机推荐
- python中讲的好的内容记载
什么是Name_mangling以及python的下划线约定 (转载来源:https://blog.csdn.net/handsomekang/article/details/40303207)
- [硬件]_ELVE_STLINK下载出现nternal command error问题
我之前也出现过这个这个,然后折腾一晚上,升级什么都都不好使 最后我换了一根短的线,回归正常!!!
- Day 15 模块
模块 ```python'''模块:一系列功能的集合体 定义模块:创建一个py文件就是一个模块,该py文件名就是模块名 使用模块:在要使用模块的文件中,通过 import 模块名 来导入模块''' ' ...
- 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】
1 wiringPi for Python简介 wiringPi for Python是wiringPi的Python语言扩展,用于在Python程序中操作GPIO/I2C/SPI库/UART/PWM ...
- WinEdt和LaTeX的简介
LaTex 是一款Tex软件, 是一款专业的 pdf 排版软件,功能强大,上手简单,是老板折磨新同学的一件非常好用的利器,能让你仅用两个晚上就达到肾虚的效果. LaTex的软件由MikTex以及编译器 ...
- python基础知识5---数据类型、字符编码、文件处理
阅读目录 一 引子 二 数字 三 字符串 四 列表 五 元组 六 字典 七 集合 八 数据类型总结 九 运算符 十 字符编码 十一 文件处理 十二 作业 一 引子 1 什么是数据? x=10,10 ...
- java中的线程中断
线程会根据中断标志位 自行了断自己 https://www.cnblogs.com/yangming1996/p/7612653.html 如何停止线程 1.设置中断标识位 2.sleep时设置中断标 ...
- 关于Rabbitmq的routingkey的作用
对于消息发布者而言它只负责把消息发布出去,甚至它也不知道消息是发到哪个queue,消息通过exchange到达queue,exchange的职责非常简单,就是一边接收发布者的消息一边把这些消息推到qu ...
- 【dbdiff】数据库比对工具安装
安装git 忽略 安装visual c++组件(和mysql workbench需要的一样) https://www.microsoft.com/en-us/download/details.aspx ...
- C# 6.0:String Interpolation
在开发中经常需要对字符串进行格式化处理.我们一般使用String.Format()方法,它会将指定字符串中的每个格式项替换为相应对象的值的文本等效项.虽然这很普通,但有时会容易使人迷惑并造成错误.因为 ...