首页 > 其他分享 >Leetcode Hot 100 & 560. Subarray Sum Equals K

Leetcode Hot 100 & 560. Subarray Sum Equals K

时间:2023-06-16 16:11:49浏览次数:63  
标签:pre count 子串 nums 560 Sum Equals int sum

  参考资料:

  考点:子串 & [题干]

1 Input: nums = [1,1,1], k = 2
2 Output: 2

  这道题说实话看得我一脸懵,第一时间想到的自然是双层循环遍历的一个$O(n^2)$的解法,也就是官方的解法一。但是使用这种解法会超时(Python语言是这样的,评论区有人提到了),我知道会扑该所以直接不写了,然后思索了半天还是没有好的思路,就直接看解答了。

  解答二说实话蕴含了非常牛逼的思想(以空间换时间,hash表),这个解法我觉得如果初见这题的人能在一天之内想到,我都会佩服的五体投地。太精致巧妙了!并且一同百通,对于子串这个考点是非常好的例子。

  1. 对解答二的理解

  解答二蕴含了一个(让人拍大腿,懊悔自己为啥没想到的)基本的思路,即连续的子串和实际上等于两个前缀子串和的差。两个前缀子串[1, 2, 3]和[1, 2, 3, 4, 5],可以推出子串[4, 5]的和是9。此时我们反其道而行之,如果k = 9,当我们遍历到5时,即pre_sum[4] = 1 + 2 + ... + 5 = 15,我们计算pre_sum[4] - k = 6,则如果[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]的前缀和里面有6,那么岂不美哉,正正好好对上了!下面是我自己的Python实现,官方解法没有给python语言,我自己写了代码但是超时了。。。用了别人的代码可以过,感觉像是他的代码效率更高。。。不懂为啥,别人的:

 1 class Solution(object):
 2     def subarraySum(self, nums, k):
 3         """
 4         :type nums: List[int]
 5         :type k: int
 6         :rtype: int
 7         """
 8         d={0:1} ; 
 9         he = ans = 0
10         for v in nums:
11             he  += v
12             ans += d.get(he-k ,0)
13             d[he] = d.get(he,0) + 1
14         return ans

  我写的:

 1 class Solution(object):
 2     def subarraySum(self, nums, k):
 3         """
 4         :type nums: List[int]
 5         :type k: int
 6         :rtype: int
 7         """
 8 
 9         n = len(nums)
10 
11         pre_sum_count = {}
12         pre_sum_count[0] = 1
13 
14         pre_sum = 0
15         count = 0
16         for i in range(n):
17             pre_sum += nums[i]
18             if pre_sum - k in pre_sum_count.keys():
19                 count += pre_sum_count[pre_sum - k]
20             
21             if pre_sum not in pre_sum_count.keys():
22                 pre_sum_count[pre_sum] = 1
23             else:
24                 pre_sum_count[pre_sum] += 1
25 
26         return count

  可能是多了很多 in 的判断。。。但是为什么用get就不会有这个问题。。。anyway,又学会了一个get(XX, 0),即获取key=XX的值,不存在则返回0,多学了一招喔。

  收获:

  1. 空间换时间的思想
  2. 使用hash散列表代替数组做存储器的思想。人话:数组的索引是非负整数,很多时候有局限性,此时需要用到hash表,在python中对应的实现就是dict

标签:pre,count,子串,nums,560,Sum,Equals,int,sum
From: https://www.cnblogs.com/chester-cs/p/17485819.html

相关文章

  • AtCoder Beginner Contest 298 Ex Sum of Min of Length
    洛谷传送门AtCoder传送门挺无脑的。是不是因为unr所以评分虚高啊/qd考虑把\(L_i\toR_i\)的路径拎出来,那么路径中点(或中边)左边的点挂的子树到\(L_i\)更优,右边的点挂的子树到\(R_i\)更优。差分一下,可以转化成\(O(q)\)次询问,每次询问形如\((u,v)\)表示求\(v\)......
  • “==”和“equals”的区别
    “==”既可以比较引用对象,也可以比较基本数据类型。当是引用对象时,比较其地址是否一样,是否为同一对象。基本数据类型则比较其值。“equals”是object的一个方法。比较时看是否重写equals方法。默认是比较是否为同一对象,但是例如String类重写了,可以比较字符串值是否相等......
  • [ABC162E] Sum of gcd of Tuples (Hard)
    题面翻译给定\(n,k\),求\[\sum^k_{a_1=1}\sum^k_{a_2=1}\sum^k_{a_3=1}\dots\sum^k_{a_n=1}gcd(a_1,a_2,a_3,\dots,a_n)\mod\1000000007\]制約$2\\leq\N\\leq\10^5$$1\\leq\K\\leq\10^5$。思路点拨我们看到这么多\(\gcd\)的式子,我们自然想到莫比乌斯反演......
  • mysql-主从数据一致性检查工具 pt-table-checksum
    pt-table-checksum工具介绍pt-table-checksum是PerconaToolkit的一个组件,用于检测MySQL主、从库的数据是否一致。它的原理是在主库执行基于statement的SQL语句来生成主库数据块的checksum,把相同的SQL语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比......
  • Java8-Consumer的使用场景
    Java8的Consumer比较抽象。结合几个例子来看看常用的使用场景有以下几个:把方法作为函数的入参Java8中可以使用Consumer来实现在函数的入参中传递方法,这个如果熟悉js的话可能会比较好理解一些。在某些情况下,不能直接使用某个对象的方法,需要把方法传递到另一个函数里面去执行,那么......
  • Gorm中使用sum查询的一个问题
    sum函数没有查到数据默认返回NULL,需要用IFNULL函数判断下 packagegorm_testsimport("fmt""github.com/stretchr/testify/require""gorm.io/driver/mysql""gorm.io/gorm""testing""time")/*......
  • Educational Codeforces Round 5-E. Sum of Remainders
    原题链接E.SumofRemainderstimelimitpertestmemorylimitpertestinputoutputCalculatethevalueofthesum: n mod 1 + n mod 2 + n mod 3 +...+ n mod m......
  • English Learning Articles 2022-06-11 Your teen wants to get in shape this summer
    Yourteenwantstogetinshapethissummer?Whattosayandwhentoworry|CNN Ifyourchildrensaytheywanttostartexercisingorworkingoutmorethissummer,don’tcelebratejustyet.Iknowmostparentswouldbethrilledtoseetheirteenstakin......
  • SummerResearch_Log_20230610
    WorkingContent:1.目前要做的任务是将classifier_resnet18.py用的方法做一些改动,原来是训练一个被污染的数据集,然后用干净的测试集去测试正常数据的识别成功率和污染数据的攻击成功率。比如某种dog属于dog类,我现在找了个trigger(比如加了个黑方格到dog的图像上),并且把加了trigg......
  • 从 sum 求和谈 axis=1 or 0
    二维数组axis=0:表示从上往下axis=1:表示从左往右temp=np.array([[1,2],[3,4]])print("原矩阵数组:\n",temp)axis0=temp.sum(0)#从上到下求和axis1=temp.sum(1)#从左往右求和print("axis0(从上到下求和):",axis0)print("axis0(从左往右求和):",axis1)三维数......