力扣精选算法100道——和为 K 的子数组[前缀和专题]

和为K的子数组链接


目录

第一步:了解题意​编辑

第二步:算法原理

第三步:代码


第一步:了解题意

数组中和为k的连续子数组,我们主要关注的是连续的, 比如[1,1,1],和为2的子数组有俩个,比如第一个1和第二个1,还有第二个1和第三个1,都是属于俩种不同的情况。

比如[1,2,3],1+2=3属于一组,3也属于一组,所以有俩组。

我们可以认为

  • sum-k=0,相当于sum=k属于一种情况,1+2=sum=3 
  • 还有一种情况是 sum-x=k,我们看到1+2+3=sum=6,x=3的时候,sum-x=k=3,我们也可以认为是满足情况的 (就是除去最后一个数前面的区间)

第二步:算法原理

  • 解法1:暴力法,时间复杂度为O(n^2)

    双循环,求出所有子数组的和,记录等于k的次数

  • 解法2:哈希表,时间复杂度O(n)

首先思考暴力法的计算过程,我们会发现暴力法中存在很多重复计算的过程。例如我们计算数组nums[0]+nums[1]+nums[2]时,nums[1]+nums[2]被算了一次,当第二次循环计算nums[1]+nums[2]的时候,它又被计算了一次。所以,如果想要减少算法的时间复杂度,我们需要考虑如何减少重复计算。


因为数组的个数有限,所以计算出所有的累加和时间为O(n),我们用一个HashMap记录sum[],其中key为sum[i],value为sum[i]出现的次数。若存在sum-k=x,x对应的value值为ret,则代表这种情况下有ret个子数组和为k。依次累加x1、x2...最终求出总个数。

步骤就是我们拿[1,1,1]来做说明

  • sum=1 sum-k!=0 就不记入hash中,然后我们将hash[sum]++,就将sum=1存入hash表中
  • sum=1+1=2  sum-k=0 记入hash中,ret++,然后就将hash[sum]++ ,就将sum=2存入hash中

  • sum=1+1+1=3 sum-k=1 此时sum-k=1在hash表中出现过,ret++,然后就将hash[sum]++,将sum=3存入hash表中

我们疑惑的是为什么sum-k=1也ret++,因为我们上面说过了,sum-k=1,其实就是sum-1=k,如果前面存在sum=1的话,剩下的区间区间和等于k。

假如说sum-k等于前面出现过的某个前缀和的话,那么sum减去x其实就是减去了前面的一个区间此时剩下的这个区间的和就等于k。

当sum-k=1的时候说明sum减去前缀和为1的区间剩下的区间的和等于k,对应在这个111上就是sum减去第一个1之后剩下的区间加起来等于k。

也就是我上述说的俩种情况。第一种情况就是累加碰到sum[i]=k的那么就满足,第二种情况就是加到某个值之和之后我们减去k剩下的区间和是曾经累加的和,那么我们就也ret++。

这就得运用到hash表了,记录每次sum的值。


第三步:代码

class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int>hash;//统计前缀和出现的次数hash[0]=1; //下标为0存入1,如果后面的sum-k==0,那么就加对应的值//hash[0]=1 <0,1>绑定,前面的0代表sum-k=0,后面的1代表次数int sum=0,ret=0;for(auto x:nums){sum+=x;//前缀和if(hash.count(sum-k)) ret+=hash[sum-k];//统计个数//(sum-k==0或者sum-k==曾经出现的前缀和_)hash[sum]++;//将当前的前缀和留在hash中}return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDL Designer 2021.1 如何将默认编辑器修改为VsCode

第1步 安装Vscode 第2步 添加Vscode至HDL Designer 第3步 更改HDL Designer编译器 第4步 修改结束&#xff0c;在HDL Designer中双击block可使用Vscode编辑verilog

通过无线打通两个路由器

通过无线打通两个路由器 上网向导无线连接 配置比较简单&#xff0c;有些路由器支持有些不支持&#xff0c;支持的大致就是下面的方法&#xff0c;不过不同型号面板不一样&#xff0c;这里主要学习方法&#xff0c;所以不做路由器型号介绍。 重要的事情说三遍&#xff1a;学习要…

云端录制直播流视频,上传云盘

前言 哪一天我心血来潮&#xff0c;想把我儿子学校的摄像头视频流录制下来&#xff0c;并保存到云盘上&#xff0c;这样我就可以在有空的时候看看我儿子在学校干嘛。想到么就干&#xff0c;当时花了一些时间开发了一个后端服务&#xff0c;通过数据库配置录制参数&#xff0c;…

修改数据库字段长度报错如何解决

如果直接修改SQL报错的话&#xff0c;可以考虑【增加备用字段->复制字段值->删除原字段->备用字段改名】的思路进行处理。 执行的时候建议一步一步执行而非批量执行 其中COLUMN_T为备用字段&#xff0c;COLUMN_O为原字段。 -- 根据原字段创建新长度的备用字段 alte…

挑战杯 python+深度学习+opencv实现植物识别算法系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的植物识别算法研究与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 更多…

Java学习笔记2024/2/5

综合练习题 练习一&#xff1a;飞机票 需求: 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;1…

【数论】矩阵快速幂

参考&#xff1a;矩阵快速幂算法详细解析 放个板子 int M, n;struct node // 定义一个矩阵类型的结构体 {int m[100][100]; } ans, res; // ans是结果&#xff0c;res是最初的方阵node mul(node A, node B) {int i, j, k;node temp; // 定义一个临时矩阵&#xff0c;存放A…

面试复盘7——后端开发

前言 一面&#xff08;2024-1.25&#xff09; 首先上来是自我介绍。 &#xff08;这里自我介绍时候项目只说了技术栈&#xff0c;没有说内容&#xff0c;不知道好不好&#xff09; &#xff08;在校经历说的一点点口语化了&#xff09; 先问的近期实习经历&#xff0c;和我确…

js和node事件循环区别

javaScript事件循环机制 一、是什么&#xff1f; JavaScript是一门单线程语言&#xff0c;同一时间只能做一件事&#xff0c;但并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻塞的方式就是事件循环。 JavaScript中&#xff0c;所有的任务都可以分为&#xff1a; 同步…

93.网游逆向分析与插件开发-游戏窗口化助手-升级经验数据获取的逆向分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;显示游戏数据到小助手UI 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;852c339f5e4c103390b123e0eaed…

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程&#xff0c;这个流程中会涉及到各种硬件的配置与交互&#xff0c;包…

Python接口自动化测试框架运行原理及流程

这篇文章主要介绍了Python接口自动化测试框架运行原理及流程,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框…

【GAMES101】Lecture 17 材质

目录 材质 漫反射 镜面反射 折射-Snell’s Law Fresnel Reflection / Term&#xff08;菲涅耳项&#xff09; 微表面模型 各向同性与各向异性 BRDF的性质 测量BRDF 材质 渲染方程中的BRDF描述了物体是如何与光线作用的&#xff0c;而物体的材质决定了它看起来是怎么样…

【深度学习理论】持续更新

文章目录 1.统计学习理论 1.统计学习理论 统计学习理论&#xff0c;一款适合零成本搞深度学习的大冤种的方向 从人类学习到机器学习的对比&#xff08;学习的过程分为归纳和演绎 &#xff09;&#xff0c;引出泛化和过拟合的概念。 如何表示归纳的函数规律呢&#xff1f;以监督…

CVE-2024-0352:Likeshop任意文件上传漏洞复现 [附POC]

文章目录 Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关…

什么是可解释AI

可解释性AI&#xff08;XAI&#xff09; 可解释性AI&#xff08;XAI&#xff09;旨在提高人工智能系统的透明度和可理解性&#xff0c;使人们更好地理解AI的决策过程和原理。随着AI技术的广泛应用&#xff0c;XAI成为了一个备受关注的重要领域。它不仅有助于建立人们对AI的信任…

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---01实际使用API函数

layout: post title: “RT-Thread线程间通信” date: 2024-2-5 15:39:08 0800 tags: RT-Thread 线程间通信 这一篇是实际使用, 代码分析看后面的文章 一般可以使用全局变量以及线程间同步进行实现 RT-Thread也提供了一部分的通信机制 邮箱 一个线程发送, 另外的线程接受信息…

C++从零开始的打怪升级之路(day32)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于list的模拟实现&#xff0c;今天只实现一部分基…

高清符合要求的SCI图片使用RStudio导出

4.图片格式区别和常识 在计算机中&#xff0c;JPEG&#xff08;发音为jay-peg, IPA&#xff1a;[ˈdʒeɪpɛg]&#xff09;是一种针对照片视频而广泛使用的有损压缩标准方法。这个名称代表Joint Photographic Experts Group&#xff08;联合图像专家小组&#xff09;。此团队创…

微信小程序学习指南:从基础知识到代码展示

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…