当前位置:网站首页>leetcode-序列和为K的数量-对前缀和和哈希代码的分析
leetcode-序列和为K的数量-对前缀和和哈希代码的分析
2022-07-19 05:15:00 【lyz_fish】
本题与主站 560 题相同: https://leetcode.cn/problems/subarray-sum-equals-k/ 代码不是自己code出来的,对大佬写的算法的总结:
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
d = defaultdict(int, {
0: 1})
ans, sum = 0, 0
for num in nums:
sum += num
ans += d[sum - k]
d[sum] += 1
return ans
其实本题的思路就是,当循环遍历到 n u m s [ i ] nums[i] nums[i]的时候。查看前面是否存在和为 k − n u m s [ i ] k-nums[i] k−nums[i]的前缀,我们可以称之为 n u m s [ j ] , j ∈ { 1 , 2 , . . . , i } nums[j], j \in \{1,2,...,i\} nums[j],j∈{ 1,2,...,i}。
如果可以找到 ∑ x = j i n u m s [ x ] + n u m s [ i ] = k \sum_{x=j}^{i}nums[x] + nums[i] = k ∑x=jinums[x]+nums[i]=k就代表索引 j j j到 i i i之和满足k这个要求。
s u m [ i ] sum[i] sum[i]表示前i项的和,通过变形,可以推出, s u m [ i ] = s u m [ i − 1 ] + n u m s [ i ] sum[i] = sum[i-1] + nums[i] sum[i]=sum[i−1]+nums[i]。
而 s u m [ i ] − k = s u m [ i − 1 ] + n u m s [ i ] − k sum[i] - k = sum[i-1] + nums[i] -k sum[i]−k=sum[i−1]+nums[i]−k
初始化一个哈希表,记录所有前 i i i项的和的字典,形如:hashmap = {0:1, ∑ i = 0 1 n u m [ i ] \sum_{i=0}^1num[i] ∑i=01num[i]:?, ∑ i = 0 2 n u m [ i ] \sum_{i=0}^2num[i] ∑i=02num[i]:?,…, ∑ i = 0 i − 1 n u m [ i ] \sum_{i=0}^{i-1}num[i] ∑i=0i−1num[i]:?}。
那么如果字典中存在值为: s u m [ i − 1 ] + n u m s [ i ] − k sum[i-1] + nums[i] - k sum[i−1]+nums[i]−k的键,使得键 ∑ i = 0 ? n u m s [ i ] \sum_{i=0}^?nums[i] ∑i=0?nums[i] = s u m [ i − 1 ] + n u m s [ i ] − k sum[i-1] + nums[i] - k sum[i−1]+nums[i]−k。通过移项,就是 k = s u m [ i − 1 ] + n u m s [ i ] − ∑ i = 0 ? n u m s [ i ] k = sum[i-1] + nums[i] -\sum_{i=0}^{?}nums[i] k=sum[i−1]+nums[i]−∑i=0?nums[i],意义上,就是在 ∑ i = ? i n u m s [ i ] = k \sum_{i=?}^{i}nums[i] = k ∑i=?inums[i]=k确实是连续子空间。
哈希表中,键为前n项的和,值为对应的前n项的和出现的次数。
只要满足条件,就在哈希表中取值,累加到result中。
边栏推荐
- 详细讲解JS中的加法(+)运算,基本数据类型相加,引用数据类型相加底层的运算规则,[]+{},{}+[]
- Log access development with one person per day and nine people per day -- project development practice based on instruction set Internet of things operating system
- Qt字符串操作
- 个人博客网站文章添加目录导航
- Code audit system
- Leetcode:20. 有效的括号【三种思路+不同语言实现】
- Leetcode:13.罗马数字转整数【键值对映射】
- 【PTA】 7-19 支票面额 (15 分)
- Leshan normal programming competition 2020-a: good pairs
- 2021-09-30
猜你喜欢
线性卷积、循环卷积、周期卷积的定义、计算方法及三者之间的关系
Solution of STM32 cubeide breakpoint failure
Detailed explanation of multiresolution decomposition and reconstruction of wavelet analysis
Connaissance de la technologie des tunnels d'infiltration Intranet
FPGA skimming p2: multifunctional data processor, calculate the difference between two numbers, use generate For statement simplifies the code, uses sub modules to realize the size comparison of three
The Debian system is ported with USBWiFi rtl8192eu driver and set to start automatically
Deep parsing ThreadLocal
FPGA skimming P4: use 8-3 priority encoder to realize 16-4 priority encoder, use 3-8 decoder to realize full subtracter, realize 3-8 decoder, use 3-8 decoder to realize logic function, and use data se
Vulnhub target jangow: 1.0.1
雷达基础系列文章之五:雷达调制样式的功能
随机推荐
Bing必应搜索用不了方法
Solution of STM32 cubeide breakpoint failure
Generics of typescript
计算机408+数据库【适合考研复试或期末复习】
Leetcode:20. 有效的括号【三种思路+不同语言实现】
Stm32f4 uses advanced timer to output PWM wave (including code)
单电源运放和双电源运放及其供电方式选择与转换的注意事项
STM32 CubeIDE 断点失效的解决方法
SSH协议中隧道与代理的用法详解
Depth evaluation of Ruixin micro rk3568 development board
乐山师范程序设计大赛2020-E: 分石头【01背包】
【PTA】7-24 约分最简分式 (15 分)
Differences between types any, void, unknown, and never in typescript
RDO deployment openstack single node
乐山师范程序设计大赛2020-B: 设计网页【判素数】
[BOM] first knowledge of BOM~
【OpenCV】边缘检测 [API与源码实现]
Bing Bing search doesn't work
Ktor 2.0?半香不香的尴尬
TCP three handshakes and four swings