LeetCode HOT 100 —— 560. 和为 K 的子数组

news2024/11/20 16:29:46

题目

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数
在这里插入图片描述

思路

首先,要明白本题不能使用双指针或者滑动窗口,因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代,确定窗口的收缩方向,这有负数,就完全不知道是左边缩小,还是右边缩小了,因为nums[i]可以小于0,也就是说右指针i向后移1位不能保证区间会增大,左指针j向后移1位也不能保证区间和会减小。

二者的区别:

(1)滑动窗口

  • 右指针平稳移动,左指针视情况移动。右先行,左视定。
  • 多数情况下可以先对数组进行排序处理;
  • 循环条件以及边界条件一定要处理好;
  • 对于负数,滑动窗口处理不好,左右摇摆了,不知道往那边走了

(2)前缀和

  • 当循环到 i 时,往往需要前 i-1项 的和来处理;
  • 多数结合HashMap ,不要重复就HashSet。

思路 : 前缀和 + 哈希表

本题是一道经典的前缀和运用题

定义 pre[i][0..i]里所有数的和,则 pre[i]可以由 pre[i−1]递推而来,即:

  • pre[i] = pre[i−1] + nums[i]

那么「[j..i]这个子数组和为 k 」这个条件可以转化为

  • pre[i] − pre[j−1] == k

(因为pre[i]表示 [0..i]的和,pre[j−1]表示 [0..j-1]的和,则pre[i] − pre[j−1]表示 [0..i] - [0..j-1] = [j..i]的和)

简单移项可得符合条件的下标 j需要满足

  • pre[j−1] == pre[i] − k

在这里插入图片描述

所以考虑以i结尾的和为 k 的连续子数组个数时只要统计有多少个前缀和为 pre[i]−kpre[j]即可。

建立哈希表 map,以为键,出现次数为对应的值,记录 pre[i]出现的次数,从左往右边更新 map,那么以 i 结尾的答案 map[pre[i]−k]即可在 O(1) 时间内得到。最后的答案即为所有下标结尾的和为 k 的子数组个数之和。

算法流程图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PS:需要注意的是,从左往右边更新边计算的时候已经保证了map[pre[i]−k]里记录的 pre[j]的下标范围是 0≤j≤i。同时, 由于pre[i]的计算只与前一项的答案有关 ,因此可以不用建立 pre数组,直接用 pre变量来记录 pre[i−1]的答案即可

java代码如下:

class Solution {
	public int subarraySum(int[] nums ,int k){
		int count = 0, pre = 0;
		HashMap<Integer, Integer> map = new HashMap<>();
		map.put(0,1);//对于一开始的情况,下标 0 之前没有元素,可以认为前缀和为 0,个数为 1 个
		for(int i = 0; i < nums.length; i++){
			pre += nums[i];//计算前缀和
			if(map.containsKey(pre - k)){
				count += map.get(pre - k);
			}
			map.put(pre, map.getOrDefault(pre,0) + 1);
		}
		return count;
	}
}

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

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

相关文章

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效&#xff0c;像Diablo II中的魔法效果的实现&#xff0c;幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合&#xff0c;接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的&#xff1a; https://github.com/sayajin-labs/kakarot&#xff08;ZK-EVM type 3 written in Cairo, leveraging STARK proof system.&#xff09; Kakarot提供了相应的playground&#xff1a; https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作&#xff0c;也有几个现成的库能实现我需要的功能&#xff0c;但用起来总是感觉不顺手。 于是便抽了两天时间&#xff0c;在aaz.libxl库的基础上&#xff0c;按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址&#xff1a;http://che…

基于docker部署nexus并创建发布npm包

1. nenus部署 1.1 搜索镜像 [rootsurpass ~]# docker search nexus INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/sonatype/nexus3 …

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况&#xff0c;一个用户拿着无线移动设备在一个Wi-Fi服务区内走动&#xff0c;并且边…

【Django】第一课 基于Django超市订单管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架&#xff0c;采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件&#xff0c;打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径&#xff0c;并使用创建django项…

UDP通信

目录 一.预备知识 1.1IP与MAC 1.2端口号 1.3TCP与UDP协议 2.4网络字节序 二.socket编程接口 2.1socket常见API 2.2sockaddr结构 3.UDP网络程序 3.1服务端 3.1.1服务端创建套接字 3.1.2绑定服务端 3.1.3recvfrom 3.2客户端 3.2.1客户端创建套接字 3.2.2客户端绑…

目标检测之Faster RCNN分析

基本流程 图像输入网络得到特征图使用RPN生成候选框&#xff0c;将候选框投影到特征图获得特征矩阵对特征矩阵使用ROI pooling得到特征图并展平&#xff0c;得到预测结果 重点解析 RPN在网络中的位置 在上图中&#xff0c;从feature map层来看&#xff0c;有两个指向上层的箭头…

善用数据框,让你的工作更严谨统一,让你的地图更优雅、更专业

前言:数据框,一个经常被忽略的东西,只有偶尔才被想起。善用数据框能更好的管理我们的投影,更能轻松的控制图层的范围,甚至利用裁剪数据框更能让我们的地图好看...什么是数据框 好吧,这个很基础,但是我还是要提一下,可能有的读者确实不知道,毕竟它的中文译名就很奇怪。…

get/post/put/delete请求头说明

目录 1.请求头说明 2.get 3.delete 4.post 5.put 6. 说明 7.Content-Type说明 1.请求头说明 前端发出的请求通过浏览器进行查看&#xff0c;可以发现分为四个部分。常规信息(General)&#xff0c;请求头信息(Request Headers)&#xff0c;响应头信息(Response Headers)…

[思维模式-12]:《如何系统思考》-8- 工具篇 - 因果回路图/系统循环图/系统控制图,系统思考的关键工具

目录 第1章 因果回路图概述 1.1 什么是因果回路图 1.2 反馈回路 第2章 因果图的组成 2.1 回路 2.2 变量 2.4 连接 > 不同变量之间的函数关系 2.5 增强回路 2.6 调节回路 2.7 时间延时 第3章 因果图的用途与应用 3.1 因果图的价值 3.2 因果图的用途 第4章 因果图…

分布式微服务技术栈-SpringCloud+RabbitMQ+Docker+Redis

微服务技术栈一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分远程调用2 eureka注册中心3 Ribbon 负载均衡4 nacos 阿里注册中心一、微服务 介绍了解 分布式架构的一种 把服务进行 拆分 springcloud 解决了 服务拆分过程中的 治理问题 与单体应用 进行区…

云服务器ECS入门

云服务器ECS入门 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵&#xff1a;2.描点&#xff08;显示字符函数&#xff09;&#xff1a;3. 要打开LCD设备&#xff1a;4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址&#xff1a;6.清屏并显示字符&#xff1a;二、显示汉字1.区位码&…

WSL2的安装、应用

WSL2的安装、应用WSL安装、升级常用命令WSL导入导出其他 - 图形界面、虚拟化WSL安装、升级 win10系统上开启WSL参考如下&#xff0c;我先是安装了WSL1&#xff0c;之后又升级到WSL2的。关键是一些Win10上电配置&#xff0c;之后在windows应用商店下载ubuntu即可。 win10上lin…

又一家中国企业加入RISC-V,中国力推之下必将打破ARM的垄断

近日消息指腾讯已正式加入RISC-V&#xff0c;并且是以高级别的高级会员加入&#xff0c;显示出腾讯开发RISC-V架构芯片的决心&#xff0c;这显示出中国芯片行业正齐心协力发展RISC-V架构&#xff0c;将打破ARM的垄断。腾讯在芯片行业已取得一定的成绩&#xff0c;分别推出了AI推…

文字对称中的数学与魔术(二)——英文字母到单词的对称性

早点关注我&#xff0c;精彩不错过&#xff01;在上一篇文章中&#xff0c;我们引入了语言文字对称性这个领域&#xff0c;重点介绍了阿拉伯数字的对称性&#xff0c;相关内容请戳&#xff1a;文字对称中的数学与魔术&#xff08;一&#xff09;——阿拉伯数字的对称性今天我们…

Linux系统基础——内存管理

Linux系统内存管理 特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料&#xff0c;本文大部分内容和所有图片来源于这个专栏。 1 物理内存 物理内存根据 NUMA 架构分节点。每个节点里面再分区域。每个区域里面再分页。 物理内存页通过伙伴系统进行分配。进程通过虚拟地址…

xv6 源码调试环境搭建

一、资源 官网&#xff1a;https://pdos.csail.mit.edu/6.828/2022/ 二、搭建 xv6 调试环境 1、下载 xv6 源码 git clone git://github.com/mit-pdos/xv6-riscv.git2、安装工具链 特别说明&#xff1a;ubuntu 仓库中已经提供&#xff0c;可直接安装。 1、从 ubuntu 仓库中…