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

news2024/10/7 14:31:13

和为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.coloradmin.cn/o/1437932.html

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

相关文章

Springboot简单设计两级缓存

两级缓存相比单纯使用远程缓存&#xff0c;具有什么优势呢&#xff1f; 本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远…

JWT令牌 | 一个区别于cookie/session的更安全的校验技术

目录 1、简介 2、组成成分 3、应用场景 4、生成和校验 5、登录下发令牌 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Pyth…

波纹扩散效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>波纹扩散</title><style>body {disp…

在 vite + ts 中,使用require

因为 require 属于 Webpack 的方法&#xff0c;所以 Vite 项目中是不能使用require的&#xff0c;所以控制台会给你报错&#xff0c;如下 解决办法如下&#xff1a;就是很不情愿的办法&#xff0c;没招啊 第一步、安装插件 npm i vite-plugin-require-transform --save-de…

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…

服务器安装Docker (centOS)

1. 卸载旧版本的Docker&#xff08;如果有&#xff09; 首先&#xff0c;如果您的系统上安装了旧版本的Docker&#xff0c;需要将其卸载。Docker的旧版本称为docker或docker-engine。使用以下命令来卸载旧版本&#xff1a; sudo yum remove docker \ docker-client \ docker-…

vCenterServer部署

一、硬件配置 vCenterServer本身最低的硬件要求是14GB&#xff0c;而vCenterServer则是以虚拟机的形式安装在ESXi中的虚拟机&#xff0c;所以ESXi的最低硬件要求是15.5GB&#xff0c;就是15872MB 二、安装vCenterServer 直接解压VMware-VCSA-all-8.0.0-20920323.iso&#xf…

使用No-SQL数据库支持连接查询用例的讨论

简介 在本文中&#xff0c;我们将简单介绍什么是No-SQL数据库。然后我们会讨论一种使用关系数据库比较容易实现的查询&#xff0c;即连接查询&#xff0c;怎么样使用No-SQL来实现。 什么是No-SQL数据库 与No-SQL数据库相对应的是传统的关系数据库&#xff08;RDBMS&#xff…

Leetcode刷题-(11~15)-Java+Python+JavaScript

算法是程序员的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写算法题吧 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…

关于可变类型和不可变类型的探究

个人猜想&#xff08;很遗憾失败了&#xff09; 在硬盘或者系统中存在一个字符集 如果存在硬盘中&#xff0c;那么硬盘出厂的时候他的字符集所占用的空间就已经确定了。 如果存在于系统的话&#xff0c;硬盘应该在出厂的时候为系统设置一个存储系统字符集的地方。在安装系统…

【Scala】1. 变量和数据类型

1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件&#xff0c;注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下&#xff1a; hello world!Pr…

go 版本 LeeCode 刷题 在线

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0001.Two-Sum/ 参考 https://github.com/anzhihe/learning/tree/master/shell/book/abs-3.9.1_cn

Java Character源码剖析

Character类除了封装了一个char外&#xff0c;还封装了Unicode字符级别的各种操作&#xff0c;是Java文本处理的基础。下面结合源码分析Character的贡献。 Unicode 也许你没听过Unicode&#xff0c;但应该见过UTF-8。UTF-8&#xff08;8-bit Unicode Transformation Format&a…

LeetCode:14.最长公共前缀

14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码有限注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 仅有一种&#xff0c;LeetCode的四种解法&#xff0c;三种都是来水的&#…

SpringBoot3整合Mybatis-Plus,自定义动态数据源starter

文章目录 前言正文一、项目总览二、核心代码展示2.1 自定义AbstractRoutingDataSource2.2 动态数据源DynamicDataSource2.3 动态数据源自动配置2.4 动态数据源上下文DynamicDataSourceContextHolder2.5 动态数据源修改注解定义2.6 修改切面DynamicDataSourceAspect2.7 动态数据…

c++设计模式之代理模式

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…

AWS创建快照定期备份

备注&#xff1a;aws有快照定期备份工具&#xff0c;名字叫【生命周期管理器】 选择实例点击创建 点击下一步后设置备份频率等 然后点击创建即可

Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)

目录 1. 前言 2. 虚拟DOM简介 2.1什么是虚拟DOM&#xff1f; 2.2为什么要有虚拟DOM&#xff1f; 3. Vue中的虚拟DOM 3.1 VNode类 3.2 VNode的类型 3.2.1 注释节点 3.2.2 文本节点 3.2.3 克隆节点 3.2.4 元素节点 3.2.5 组件节点 3.2.6 函数式组件节点 3.2.7 小结 3…

NCNN GPU初始化加速——cache实现

概要 NCNN的CPU初始化速度很快&#xff0c;但是当使用GPU进行推理时&#xff0c;初始化往往要花费几秒甚至更长时间。其他框架例如MNN有载入cache的方式来进行加速&#xff0c;NCNN目前没有相关接口来实现加速&#xff0c;那么NCNN是否也可以加载cache来实现加速呢&#xff1f;…

程序员的数字化工作台:理解不关机背后的逻辑与需求

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a; 工作流程与需求&#xff1a; 数据安全与备份&#xff1a; 即时性与响应&#xff1a; 个人习惯等方面&#xff1a; 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a;…