560.和为K的子数组

题目:

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

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

示例 1:

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

示例 2:

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

提示:

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107


1. 暴力法

遍历数组的每个起点 i
从 i 开始,依次往后延伸,形成子数组 nums[i:j]
计算这个子数组的和
如果等于 k,计数器 +1


代码实现(Go):

//package main
//
//import "fmt"func subarraySum(nums []int, k int) int {cnt := 0 // 子数组个数// 外层循环:确定子数组起点 ifor i := 0; i < len(nums); i++ {sum := 0 // 初始化子数组和// 内层循环:确定子数组终点 jfor j := i; j < len(nums); j++ {sum += nums[j] // 累加子数组元素if sum == k {  // 如果子数组和等于 kcnt++ // 计数器 +1}}}return cnt
}//func main() {
//	nums1 := []int{1, 1, 1}
//	k1 := 2
//	fmt.Println(subarraySum(nums1, k1)) // 输出 2
//}

2. 前缀和 + 哈希表优化

前缀和的概念
使用一个叫做“前缀和”的概念。对于数组中的任何位置 j,前缀和 pre[j] 是数组中从第 1 个元素到第 j 个元素的总和。如果想知道从元素 i+1 到 j 的子数组的和,可以用 pre[j] - pre[i] 来计算。

使用 Map 来存储前缀和
在代码中,用一个 Map(哈希表)来存储每个前缀和出现的次数。这是为了快速检查某个特定的前缀和是否已经存在,以及它出现了多少次。

核心逻辑
在数组中向前移动时,逐步增加 pre(当前的累积和)对于每个新的 pre 值,检查 pre - k 是否在 Map 中

pre - k 的意义:这个检查的意义在于,如果 pre - k 存在于 Map 中,说明之前在某个点的累积和是 pre - k。由于当前的累积和是 pre,这意味着从那个点到当前点的子数组之和恰好是 k(因为 pre - (pre - k) = k)

实现

  1. 遍历数组,累加前缀和 pre[j]
    pre[j]=nums[0]+nums[1]+⋯+nums[j]

  2. 用哈希表记录每个前缀和出现的次数
    key = 前缀和
    value = 出现次数

  3. 对于当前前缀和 pre,查找 pre - k 是否在哈希表里

  4. 如果存在,说明从之前某个位置到当前位置的子数组和为 k

  5. 将出现次数累加到结果

代码实现(Go):

// package main// import "fmt"func subarraySum(nums []int, k int) int {cnt := 0           // 用来记录子数组的个数pre := 0           // 当前前缀和m := map[int]int{} // 或 m:=make(map[int]int)m[0] = 1           // 前缀和 0 出现 1 次,保证一个数字刚好等于 k 时,也能被正确统计,计数+1for i := 0; i < len(nums); i++ {pre += nums[i] // 更新当前前缀和// 查找 pre - k 是否出现过,如果出现,说明从之前的位置到当前位置之间的子数组和为 kif v, ok := m[pre-k]; ok {cnt += v}// 更新哈希表,记录当前前缀和出现次数m[pre]++}return cnt
}// func main() {
// 	nums1 := []int{1, 1, 1}
// 	k1 := 2
// 	fmt.Println(subarraySum(nums1, k1)) // 输出 2
// }

无注释:

//package main
//
//import "fmt"func subarraySum(nums []int, k int) int {cnt, pre := 0, 0m := map[int]int{}m[0] = 1for i := 0; i < len(nums); i++ {pre += nums[i]if v, ok := m[pre-k]; ok {cnt += v}m[pre]++}return cnt
}//func main() {
//	nums1 := []int{1, 1, 1}
//	k1 := 2
//	fmt.Println(subarraySum(nums1, k1)) // 输出 2
//}

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

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

相关文章

3ds MAX文件/贴图名称乱码?6大根源及解决方案

在3ds MAX渲染阶段&#xff0c;文件或贴图名称乱码导致渲染失败&#xff0c;是困扰众多用户的常见难题。其背后原因多样&#xff0c;精准定位方能高效解决&#xff1a;乱码核心根源剖析字符编码冲突 (最常见)非ASCII字符风险&#xff1a; 文件路径或名称包含中文、日文、韩文等…

链路聚合路由器OpenMPTCProuter源码编译与运行

0.前言 前面写了两篇关于MPTCP的文章&#xff1a; 《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》《使用MPTCPBBR进行数据传输&#xff0c;让网络又快又稳》 对MPTCP有了基本的了解与实践&#xff0c;并在虚拟的网络拓扑中实现了链路带宽的叠加。 1.OpenMPTC…

AI时代企业转型指南:用AI降本增效,销售转化翻3倍,获客成本砍一半!

AI时代&#xff0c;大部分企业每天都在问同一个问题&#xff1a;AI到底能帮我做什么&#xff1f;无论你是做电商、做IP、做操盘手&#xff0c;还是传统企业老板&#xff0c;你都会发现一个现实——AI真正的用途是用来在业务场景里直接降本增效的。对我个人来说&#xff0c;AI已…

【牛客刷题】最大公约数与最小公倍数:算法详解与实现

文章目录 一、题目介绍 1.1 输入描述 1.2 输出描述 1.3 示例(含详细注释) 二、考察的知识点 三、算法设计思路 3.1 最大公约数(GCD) 3.2 最小公倍数(LCM) 四、流程图 五、题解实现 六、复杂度分析 七、关键算法知识点 一、题目介绍 计算两个整数的**最大公约数(GCD)和最小公…

将 iPhone 联系人转移到 Infinix 的完整指南

从 iPhone 切换到 Infinix 设备是一次令人兴奋的升级&#xff0c;但在切换过程中&#xff0c;转移个人数据&#xff08;尤其是联系人&#xff09;可能会有些棘手。联系人是任何手机上最重要的信息类型之一&#xff0c;如果在切换过程中丢失它们&#xff0c;会带来很大的不便。由…

Clipboard.js 复制内容

插件地址 clipboard.js 中文网 安装 npm install clipboard --save使用示例 <template><div><div class"copyBtn" click"copyText">复制文本</div ></div> </template><script> // 引入clipboard.js import…

蛇形方阵构造

给出方阵的长宽&#xff0c;n 和 m &#xff0c;按照斜着的蛇形输出该方阵 面试官给的送分题裸模拟&#xff0c;写的太慢了没过&#xff0c;实际确实慢&#xff0c;结束后起码用了一个多小时才调完 找了下没找到leetcode 提交的地方&#xff0c;各种oj 倒是有&#xff0c;不过是…

传统方式部署(RuoYi-Cloud)微服务

实验环境192.168.10.43和192.168.10.44内存不能小于4G一、安装MySQL&#xff08;192.168.10.46&#xff09;1、安装MySQL依赖库dnf -y install ncurses-compat-libs2、上传mysql-8.0.42-linux-glibc2.17-x86_64-minimal.tar.xz二进制包到/root目录&#xff0c;解压并移动到指定…

Linux网络服务(一)——计算机网络参考模型与子网划分

文章目录前言一、分层思想1.1 分层的基本概念1.2 点到点与端到端通信的区别二、OSI参考模型2.1 OSI七层模型的结构2.2 各层功能示例&#xff08;以QQ为例&#xff09;2.3 单工&#xff0c;半双工和全双工2.4 OSI七层模型总结三、TCP/IP模型3.1 TCP/IP四层与五层模型3.2 TCP/IP协…

Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成

目录一、IK分词器介绍与选择1. IK分词器详细介绍1.1 基本概念1.2 核心功能1.3 适用场景2. 如果不使用IK分词器&#xff0c;有哪些替代方案&#xff1f;2.1 默认分词器的局限性2.2 替代方案及对比2.3 示例&#xff1a;Ngram Tokenizer配置3. 如何选择分词器&#xff1f;3.1 决策…

实用软件推荐

作者给大家推荐两个软件&#xff1a;typedown,typora typedown在microsoft上即可下载&#xff0c;免费 如果有更多的需求建议下载typora,typora为付费软件 typora官网&#xff1a;typora官网 typedown下载&#xff1a;typedown下载 作者曾经发布的一些以"md"为后…

地图导航怎么测?

地图导航的测试需要结合功能验证、性能评估和场景模拟等多维度方法,以下是基于行业标准和实践的系统化测试方案: 一、核心测试维度与方法 (一)功能测试:覆盖导航全流程 1、基础功能验证 路线规划:输入起点 / 终点后,验证系统是否能生成最短、最快或避开拥堵的路线,并…

力扣70:爬楼梯

力扣70:爬楼梯题目思路代码题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路 首先我们先列出来前几个台阶的答案从第一个开始&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;5。…

CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力

内容源自计算机科研圈在机器人操作任务中&#xff0c;预测性策略近年来在具身人工智能领域引起了广泛关注&#xff0c;因为它能够利用预测状态来提升机器人的操作性能。然而&#xff0c;让世界模型预测机器人与物体交互的精确未来状态仍然是一个公认的挑战&#xff0c;尤其是生…

Rust 入门 生命周期-next2 (十九)

生命周期消除实际上&#xff0c;对于编译器来说&#xff0c;每一个引用类型都有一个生命周期&#xff0c;那么为什么我们在使用过程中&#xff0c;很多时候无需标注生命周期&#xff1f;例如&#xff1a;fn first_word(s: &str) -> &str {let bytes s.as_bytes();f…

Three.js 动画循环学习记录

在上一篇文章中&#xff0c;我们学习了Three.js 坐标系系统与单位理解教程&#xff1a; Three.js 坐标系系统与单位理解教程 接下来我们要学习的是Three.js 的动画循环 一、动画循环基础原理 1. 什么是动画循环&#xff1f; 动画循环是连续更新场景状态并重新渲染的过程&am…

ktg-mes 改造成 Saas 系统

ktg-mes 改造成 Saas 系统 快速检验市场&#xff0c;采用最简单的方案&#xff0c;即添加表字段 截止2025年8月16日上传的ktg-mes搭建存在一些问题&#xff0c;搭建可看文章&#xff1a; 搭建ktg-mes 改造 1. 添加租户表 create table sys_tenant (tenant_id bigint au…

【新手易混】find 命令中 -perm 选项的知识点

find 命令是 Linux/Unix 系统中强大的文件查找工具&#xff0c;广泛用于根据文件名、类型、时间、权限等条件搜索文件。其中&#xff0c;-perm 选项用于按文件权限查找文件&#xff0c;而在 -perm /mode 中出现的斜杠 / 是一种特殊的语法&#xff0c;表示“按位或&#xff08;O…

gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别

问&#xff1a; "monitor flash write_image erase ${workspaceFolder}/obj/ylad_led_blink.elf", 和 "load", "executable" : "${workspaceFolder}/obj/ylad_led_blink.elf", 的区别&#xff1f;答&#xff1a; 你提到的 "monit…

1. Docker的介绍和安装

文章目录1. Docker介绍核心概念核心优势与虚拟机的区别一句话总结2. Docker的安装Windows 10/11 安装 Docker Desktop&#xff08;推荐 WSL2 方式&#xff09;Linux&#xff08;以 Ubuntu / Debian 系为例&#xff09;Docker 是一个开源的容器化平台&#xff0c;它允许开发者将…