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 ...
随机推荐
- hello1 hello2 服务器安装加部署全过程
1.安装maven和glassfish及配置环境变 首先搜索并下载maven3.6.0和glassfish4.1.1(版本看按需要选择). 点击安装包进行安装 安装完成后开始配置环境变量 打开系统环境 ...
- 防F12扒代码:按下F12关闭当前页面
只要按下那神秘的审查元素.按下那神秘的F12键,奇迹出现了!网站变成了空白页,可谓杀防君子放火必备佳品!一段JavaScript代码即可实现上述功能,插入到 footer.php 的 </bod ...
- android BluetoothAdapter蓝牙BLE扫描总结
1.android 4.3.1(Build.VERSION_CODES.JELLY_BEAN_MR2)增加的startLeScan(callback)方法,官方在5.0之后不建议使用,实测此方法,4. ...
- node连接mongodb(简略版)
1.先通过配置启动mongodb,然后新建db.js 已经对相对应的数据库操作增删改查封装完成. //这个模块里面封装了所有对数据库的常用操作 var MongoClient = requir ...
- 个人练习:使用HTML+CSS3制作图片轮播功能(不使用JavaScript)
先上效果图,不要在意用来当素材的图片: 在搜索相关资料的时候,查到有两种实现方式:一是使用JavaScript,二是使用CSS3中的Animation(动画),这里使用的是CSS3中的Animatio ...
- Event对象中的target属性和currentTarget属性的区别
先上结论: Event.target:触发事件的元素: Event.currentTarget:事件绑定的元素: 通过下面的例子来理解这两个属性的区别: 使用Event.target属性的例子:(我在 ...
- MySQL Hardware--网络测试
使用Ping测试丢包 ## ping测试 ## -c 100表示100次 ping -c 100 192.168.1.2 输出结果: ping -c 100 192.168.1.2 PING 192. ...
- Dynamics 365—脚本
Xrm.Page.getAttribute() 转控件:controls.get(0) 取赋值:getValue(),setValue() 是否改动:getIsDirty() 表单载入时的值:getI ...
- 带查询参数 可分页 的 T-SQL 语句写法
) DECLARE @pageindex int DECLARE @pagesize int DECLARE @classid int set @keys = '' ; ; ; with temptb ...
- HTML5播放RTSP,H5播放RTSP,解决方案源码,基于海康网络摄像头
视频是用的海康网络摄像头(支持RTSP,标准H.264 RTP封装的设备),可以通过 rtsp://admin:1008@192.0.0.64:81/h264/ch1/main/av_stream ...