leetcode560
public class Solution {
public int SubarraySum(int[] nums, int k) {
int sum = , result = ;
Dictionary<int, int> preSum = new Dictionary<int, int>();
preSum.Add(, );
for (int i = ; 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, );
}
}
return result;
}
}
https://leetcode.com/problems/subarray-sum-equals-k/#/solutions
补充一个python的实现,和上面的思路一样:
class Solution:
def subarraySum(self, nums: 'List[int]', k: int) -> int:
sums = 0
count = 0
dic = dict()
for n in nums:
if sums in dic.keys():
dic[sums] += 1
else:
dic[sums] = 1
sums += n
dif = sums - k
if dif in dic.keys():
count += dic[dif]
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的子集。
这一点是数学的技巧,也是提高效率的关键。
leetcode560的更多相关文章
- leetcode560题解【前缀和+哈希】
leetcode560.和为K的子数组 题目链接 算法 前缀和+哈希 时间复杂度O(n). 在解决这道题前需要先清楚,一个和为k的子数组即为一对前缀和的差值. 1.我们假设有这么一个子数组[i,j]满 ...
- [Swift]LeetCode560. 和为K的子数组 | Subarray Sum Equals K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- LeetCode560. Subarray Sum Equals K
Description Given an array of integers and an integer k, you need to find the total number of contin ...
随机推荐
- 一分钟学会ConstraintLayout(转载)
原文地址:https://www.v2ex.com/t/287863 最近更新了Android Studio,突然发现xml中的布局已经变成了ConstraintLayout,于是搜了一篇文章看一下 ...
- MySql5.7 Distinct与Order By同时使用报错的解决方案
mysql5.7版本中,如果DISTINCT和order by一起使用将会报3065错误,sql语句无法执行.这是由于5.7版本语法比之前版本语法要求更加严格导致的. 解决方案: 1.vim /etc ...
- 剑指Offer 22. 从上往下打印二叉树 (二叉树)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目地址 https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed25 ...
- windows常用命令积累
命令行可以对文件进行操作,copy 路径\文件名 路径\文件名,复制文件:move 路径\文件名 路径\文件名,移动文件:del 文件名,删除文件. cd与dir命令,dir命令显示当前目录下的文件及 ...
- CC攻击原理及防范方法
一. CC攻击的原理: CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃.CC主要是用来消耗服务器资源的,每个人都有这样的体验:当一个网页访问的人数 ...
- JAVA第八次作业
JAVA第八次作业 (一)学习总结 1.用思维导图对本周的学习内容进行总结 参考资料: XMind. 2.通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery ...
- 分布式高并发下Actor模型
分布式高并发下Actor模型 写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的 ...
- 学习笔记(二)--Lucene简介
Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包.提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包, ...
- Django学习笔记之URL与视图
视图 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了这个http请求的所有信息,其中包括携带的参数以及一些头部信 ...
- C/C++中的volatile简单描述
首先引入一篇博客: 1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 ...