当前位置: 首页 >文章 > 前缀和解和为K的子数组
收藏
分享

前缀和解和为K的子数组

举报小虎转载君小虎转载君发布于 2021-07-19657阅读0点赞
给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。...

It hurts to remember,but it would be worse to forget.


铭记虽痛苦,但遗忘更糟糕。

问题描述


来源:LeetCode第560题

难度:中等

给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。

示例 1 :

输入:nums = [1,1,1], k = 2

输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :

数组的长度为[1,20,000]。

数组中元素的范围是[-1000,1000],且整数k的范围是[-1e7, 1e7]。

暴力求解


暴力求解是最容易想到的,枚举数组nuns的所有子数组,然后统计所有子数组和等于k的个数

来看下代码


时间复杂度:O(n^3)。

空间复杂度:O(1)。

这种时间复杂度太高,当数据量比较大的时候,很容易超时,我们再来优化一下。当我们以nums[j]为子数组最后一个元素的时候,不用每次都枚举子数组[i……j]之间所有元素的和,只需要以nums[j]为最后一个元素,从后往前累加,即可计算以nums[j]为最后一个元素的连续子数组。比较绕,来看个图

来看下代码

时间复杂度:O(n^2)。

空间复杂度:O(1)。

时间复杂度从n^3降到了n^2,我们再来看一个时间复杂度为n的解决方式,就是前缀和。

前缀和解决


所谓前缀和就是数组中前面n个元素的和,比如前缀和pre[i]的值是:

pre[i]=nums[0]+nums[1]+……+nums[i];


前缀和pre[j]的值是:

pre[j]=nums[0]+nums[1]+……+nums[i]+nums[i+1]+……+nums[j];

如果我们要求子数组[i……j]之间所有元素的和,也就是

nums[i]+nums[i+1]+……+nums[j]=pre[j]-pre[i-1];

也就是说如果pre[j]-pre[i-1]等于k,说明我们找到了一个和为k个连续子数组,这就变成了两数之和问题。因为k的值是固定的,如果枚举pre[j],我们只需要统计pre[i-1]的个数即可,这个统计方式可以使用map来解决,看下代码(这里为了方便计算,pre长度增加1,pre[0]=0)

时间复杂度:O(n)。
空间复杂度:O(n)。


本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号:数据结构和算法!


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,673人)

【5月】零基础动态表情包创作训练营
距离开班仅剩14天23人已报名
【6月】人像后期案例实操训练营
距离开班仅剩41天23人已报名
【7月电脑剪映】短视频剪辑入门训练营
距离开班仅剩63天3人已报名
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习89000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了39,428
并提交了350份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 89000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证