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 ...
随机推荐
- javascript中缺少分号结尾的情况
首先看一段代码 function* fib (max) { let a = 0 let b = 1 let n = 1 while (n < max) { yield a; [a, b] = [ ...
- Beginning Math and Physics For Game Programmers (Wendy Stahler 著)
Chapter 1. Points and Lines (已看) Chapter 2. Geometry Snippets (已看) Chapter 3. Trigonometry Snippets ...
- [随笔][Java][总结][java 类型系统]
java 的类型系统大体分为两类,对象和基本类型.java使用静态类型检查来保证类型安全.每个变量在使用之前需要声明.非静态类型的语言不要求变量在使用之前进行声明. 基本数据类型 java的基本类型不 ...
- 左耳听风-ARTS-第1周
Algorithm https://leetcode.com/problems/longest-common-prefix/ class Solution { public String longes ...
- C# System.Collections
System.collection类: 动态数组ArrayList 代表了可被单独索引的对象的有序集合.也就是说他是一个动态的数组,你可以通过索引来进行增删改等操作,数组会自动调整数组的大小.允许在列 ...
- Android studio 中添加依赖model时依赖所需的准备
例如向app中添加依赖core: core要做如下修改: 1.将core中build.gradle中 修改为 . 2.将core中的 applicationId 注释掉.
- Creating Excel files with Python and XlsxWriter——Introduction
XlsxWriter 是用来写Excel2007版本以上的xlsx文件的Python模块. XlsxWriter 在供选择的可以写Excel的Python模块中有自己的优缺点. #---------- ...
- 工控随笔_20_西门子_WinCC的VBS脚本_09_常量和流程控制_02
vbs不但提供了分支结构,还提供了丰富的循环形式.一共有3种循环: 1.for循环 2.do...loop循环 3.while循环 各种循环有各自的特点,在使用的时候可以进行转换. 前面已经描述过Fo ...
- redis 中的key值过期后,触发通知事件
1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <groupId>org.springfram ...
- 从9x9矩阵中抽取中间菱形区域打印 - perl
起因: 源自于c的练习题,打印diamond,因为perl不需编译,方便调试,故先用perl实现一下 关键: 没有想到好的思路,只能借助于上一篇打印上下三角矩阵的方法,把菱形拆成上下左右4个三角矩阵区 ...