博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode560
阅读量:6223 次
发布时间:2019-06-21

本文共 1533 字,大约阅读时间需要 5 分钟。

public class Solution {    public int SubarraySum(int[] nums, int k) {        int sum = 0, result = 0;            Dictionary
preSum = new Dictionary
(); preSum.Add(0, 1); for (int i = 0; i < nums.Length; i++) { sum += nums[i]; if (preSum.ContainsKey(sum - k)) { result += preSum[sum - k]; } if (preSum.ContainsKey(sum)) { preSum[sum]++; } else { preSum.Add(sum, 1); } } return result; }}

补充一个python的实现,和上面的思路一样:

1 class Solution: 2     def subarraySum(self, nums: 'List[int]', k: int) -> int: 3         sums = 0 4         count = 0 5         dic = dict() 6         for n in nums: 7             if sums in dic.keys(): 8                 dic[sums] += 1 9             else:10                 dic[sums] =  111             sums += n12             dif = sums - k13             if dif in dic.keys():14                 count += dic[dif]15         return count

下面进行解释,字典dic中存储的是某一个连续和的出现频率。例如nums=[1,1,1],k=2。

第一次循环时,sums等于第零项的值0,则有{0:1},表示连续和为0的情况出现了1次。

第二次循环时,sums等于第一项的值1,则有{0:1,1:1},表示连续和为1出现了1次。

第三次循环时,sums等于前两项的值2,则有{0:1,1:1,2:1},表示连续和为2出现了1次。

第四次循环时,sums等于前三项的值3,则有{0:1,1:1,2:1,3:1},表示连续和为3出现了1次。

每一次循环的过程中都判断sums-k是否在字典dic中出现过,

如果出现过,则表示到当前位置的前x项中,包含有连续和为k的子集。

这一点是数学的技巧,也是提高效率的关键。

转载于:https://www.cnblogs.com/asenyang/p/6890209.html

你可能感兴趣的文章
最近找工作面试那些事儿(6月)
查看>>
简单VC内存检测
查看>>
Electron任务栏图标定制分析
查看>>
记一次简书图片403(hexo中简书图片迁移到阿里云oss)
查看>>
vue 2.0 路由切换以及组件缓存源代码重点难点分析
查看>>
清凉一夏,“极客时间”陪你过暑假
查看>>
掘金首秀
查看>>
vue面试整理
查看>>
React基础(一)
查看>>
PageRank 算法随记
查看>>
喜马拉雅 FM--- [ Java 高级开发] [ Java 架构师] [iOS 架构师] 招聘啦
查看>>
软能力那点事,你知多少
查看>>
前端小知识10点(2019.5.28)
查看>>
基于"发布-订阅"的原生JS插件封装
查看>>
深度掌握Redis:5大难题解决方案、单线程优劣势、高并发快原因等
查看>>
JavaScript系列之类型判断
查看>>
浮动 二 文字围绕现象(下)
查看>>
C#发送短信验证码
查看>>
vue-服务端渲染6:client/server-entry.js
查看>>
十年架构师教你:如何搞定计算机网络面试
查看>>