力扣Hot100-T10和为k的子数组(前缀和+哈希表)注意思路

中等

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

思路:(忘了负数的情况,不完全对)使用滑动窗口的思想,first指向滑动窗口的起始下标,last指向滑动窗口的最后一个下标。初始状态均指向数组第一个下标:

(1)当sum>k时,说明窗口中总和过多,first向前移动,收缩窗口

(2)sum<k时,过小,last向后移动,扩大窗口

(3)sum=k时 first向前移(可能存在0的情况)

注意:每次移动first,last后要判断移动后是否还存在sum==k;

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int first=0;int last=0;int sum=0;int times=0;//注意:不要溢出,负数,while(last<nums.size()){sum+=nums[last];while(sum==k)  //{times++; sum-=nums[first];if(first+1<nums.size())first++;else break;}if(sum>k){while(sum>k){//first向前移,sum-nums[first] //1 1 0 0 1 1 3 0 0 4  (4)sum-=nums[first]; if(first+1<nums.size())first++;else break;//每移动一次也要判断是否等于while(sum==k){times++;sum-=nums[first];  if(first+1<nums.size())first++;else break;}}}if(last+1<nums.size())last++;else break;}return times;}
};

正确思路:使用前缀和+哈希表进行优化 (小红书社招二面出现过):

(1)首先使用sum[i]统计i小标之前的所有数之和(包括下标i指向的数),因此某一段序列和为k转化为sum[p]-sum[q]=k,;有效解决负数带来的问题。在遍历过程中用value记录前i个数组值得总和,使用哈希表记录,其中sum[value]对应的值表示和为value的数组段。

(2)遍历一遍sum,当前sum[p]已知,k已知,只要判断是否存在sum[q]=sum[p]-k,就能判断当前下标作为开始,是否存在一段数组之和等于k,出现次数times=times+sum[q];

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int times=0;map<int,int>sum1;int sum[30000];for(int i=0;i<nums.size();i++){if(i==0){sum[0]=nums[0];sum1[sum[0]]++;}else{sum[i]=sum[i-1]+nums[i];sum1[sum[i]]++;}int need=sum[i]-k;//有一个问题:别把当前数算进去,需要-1,当前数之和也为-1if(sum1.find(need)!=sum1.end()){if(need==sum[i]){times+=(sum1[need]-1); //[-1,-1,1]中重复计算了}elsetimes+=sum1[need];}if (need==0){//注意【0,1】1,当需要的数为零时不仅要判断0出现的次数还要把没有零的自己算进去times++;}}return times;}
};

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

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

相关文章

SpringBoot工程引用其他工程构建的jar包

1、问题 存在A、B两个工程&#xff0c;其中B工程需要引用A工程的jar包。 2、解决办法 A工程 &#xff08;1&#xff09;自动配置bean。 Configuration ComponentScan("cn.ac.trimps.auth.**") public class AuthClientConfig {} Retention(RetentionPolicy.RUNTIME…

C++中的数据封装深度解析

目录标题 1. 数据封装简介2. 为什么使用数据封装3. 实现数据封装定义类访问控制构造函数与析构函数成员函数成员变量 4. 封装的好处5. C数据封装的例程6. 拓展&#xff1a;C中::的用法1. 访问命名空间成员2. 访问类的静态成员3. 访问类的成员函数和变量4. 全局作用域解析 7. 总…

Android Studio开发之路(十)app中使用aar以及报错记录

书接上文&#xff1a;Android Studio开发之路&#xff08;九&#xff09;创建android library以及生成aar文件 五、app中使用aar文件的方法 先复制一下上面生成的aar文件。然后在你要添加到的app左上角选择“project”模式&#xff0c;然后找到libs文件夹&#xff0c;点击右键…

全自动封箱机:智能包装与物流领域的新引擎,助力产业升级

在智能化、自动化的浪潮下&#xff0c;全自动封箱机以其高效、精准的特点&#xff0c;正逐渐成为智能包装和物流领域的新宠。这种先进的机械设备不仅提升了包装效率&#xff0c;还大大地推动了物流行业的现代化进程&#xff0c;为产业升级注入了新动力。 全自动封箱机的重要性不…

Centos中将UTC的时区改为CTS时区

date命令可以看到现在的时间以及时区&#xff0c;可以看到现在是UTC时区 而想要更改时区那么就要了解tzselect命令 tzselect 是一个 Linux 命令行工具&#xff0c;用于交互式地帮助用户选择并设置系统的时区。这个程序会通过一系列的问题引导用户&#xff0c;从而确定用户所在的…

【Linux网络】HTTPS【上】{运营商劫持/加密方式/数据摘要/https的诞生}

文章目录 1.引入1.1http与https1.2SSL/TLS1.3VPN1.4认识1.5密码学1.6为什么要加密&#xff1f;运营商 1.7常见的加密方式对称加密非对称加密 2.加密与解密3.数据摘要 && 数据指纹MD5 数字 签名理解三者数据摘要&#xff08;Digital Digest&#xff09;&#xff1a;数字…

PMP项目管理证书,三天积攒60PDU,So easy!史上最全积攒PDU指南独家秘籍!

史上最全积攒PDU指南 独家秘籍! 如何积攒/查询PDU 三天积攒60PDU,So easy! 开始前,请各位同学阅读以下三个注意事项: 1. PMI官网地址:以下地址均可登入,外网网速缓慢,登录时请耐心等待,推荐使用谷歌浏览器或带翻译功能的浏览器(如360) 网址一:ccrs.pmi.org 网址二:…

实现echarts地图

效果图: 2.echarts.registerMap("xizang", XZ) 注册了一个名为 "xizang" 的地图&#xff0c;其中 XZ 是地图数据。 接下来是 option 对象&#xff0c;包含了图表的配置信息&#xff0c;比如图表的布局、提示框样式、地理组件配置和系列数据配置等。 在 t…

Nanopc T4 使用OpenCV

识别长方形&#xff1a; import cv2 import cv2 as cv import time import platform import os# 获取操作系统类型 os_type platform.system() if os_type "Windows":# Windows系统cap cv.VideoCapture(0) # 使用第零个摄像头 elif os_type "Linux"…

Linux 第二十九章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

el-tree

Vue.js 组件结构&#xff1a; 是一个 Vue.js 组件&#xff0c;它由一些 Vue 文件组成&#xff0c;包括模板&#xff08;template&#xff09;、脚本&#xff08;script&#xff09;和样式&#xff08;style&#xff09;。 模板部分定义了组件的结构和布局&#xff0c;包括树节点…

分布式光伏管理系统的意义与核心技术

分布式光伏管理系统遵循安全可靠、经济合理原则&#xff0c;满足电力系统自动化总体规划要求&#xff0c;且充分考虑光伏发电的因素&#xff0c;对分布式光伏发电、用电进行集中监控、统一调度、统一运维。为用户提供运维服务&#xff0c;实现能源互联&#xff0c;信息互通&…

软件安全测试可以检测软件哪些安全问题?

软件安全测试是一种旨在发现和评估软件应用程序中的安全漏洞和隐患的测试方法。通过安全测试&#xff0c;可以发现并修复潜在的安全问题&#xff0c;从而提高软件应用程序的可靠性和安全性。下面将介绍软件安全测试可以检测到的几种主要安全问题。 身份验证漏洞&#xff1a;身份…

如何将 DFMini player MP3 模块与 Arduino 结合使用

要创建此项目&#xff0c;您将使用&#xff1a; DFPlayer迷你MP3模块 10kΩ电阻 开关按钮 面包板 Arduino UNO 杜邦线 现在&#xff0c;我们将学习如何构建该项目。 什么是DF Mini Player MP3模块 DFMini Player 模块是一个小型音乐播放器。它成本低、功耗低&#xff0c;可…

五月采购节 | 全场板卡八七折起

淘宝搜索【北京迅为电子官方企业】 5月13日~5月15日 海量优惠券等你拿&#xff01; 复制下方链接到淘宝 直接进入店铺&#xff01; https://shop459378556.taobao.com

空号检测-号码批量检测API接口-关机停机风险号检测

手机空号检测分为普通空号检测和实时检测两种类型&#xff1a; 普通空号检测返回结果&#xff1a;实号、风险号、空号、沉默号 。 1.普通版的检测不会实时更新数据&#xff0c;因此其数据库中的信息可能不是最新的。 2.覆盖基础运营商的数据库&#xff0c;检测范围相对有限&…

每个工作室都需要的10种插件类型

插件通常是将平淡的表现转变为引人注目的声音艺术品的最灵活和经济高效的方式。对于大多数没有足够空间或资金积累昂贵外置设备的人来说&#xff0c;在电脑中工作是我们的录音能够达到广播标准的理想途径。在德声&#xff0c;我们认为每个工作室都可以从插件中受益&#xff0c;…

Spring Boot整合ElasticSearch实战 - 第511篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

呼叫中心系统选pscc好还是okcc好

选择PSCC&#xff08;商业软件呼叫中心&#xff09;还是OKCC&#xff08;开源呼叫中心&#xff09;&#xff0c;应基于以下几个关键因素来决定&#xff1a; 技术能力&#xff1a;如果企业拥有或愿意投入资源培养内部技术团队&#xff0c;开源解决方案可能更合适&#xff0c;因为…

Spring+Mybatis-plus 实现 Gauss DB数据库代码生成

需求&#xff1a; 使用的gauss db数据库&#xff08;类似oracle语法&#xff09;&#xff0c;需要根据指定表生成entity、dao等代码 1&#xff0c;引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…