力扣第560题 和为k的子数组

news2025/3/9 23:37:49

前言

记录一下刷题历程 力扣第560题 和为k的子数组


和为k的子数组

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

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

示例 1:

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

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

分析

我们可以计算前缀和如下图所示。
在这里插入图片描述
当我们知道前缀和后,我们想要知道和为k的子序列 我们值需要对前缀和数组进行相减,前缀和数组中有6 我们发现前缀和数组中6-0=6,而这个6-0指的就是连续子序列0 1 2 3。我们再看下一个21,我们发现21-15=6,而这个21-15指的就是子序列6。这样我们就可以通过前缀和来求解

代码如下:

class Solution {
public:
    // 定义函数 subarraySum,接受一个整数数组 nums 和一个目标值 k
    int subarraySum(vector<int>& nums, int k) {
        // 创建一个哈希表 map,用于记录前缀和出现的次数
        unordered_map<int,int> map;
        
        // sum 用于记录当前的前缀和,res 用于记录和为 k 的子数组的数量
        int sum = 0, res = 0;
        
        // 初始化哈希表,表示前缀和为 0 的情况出现了 1 次
        // 这是为了处理子数组本身就等于 k 的情况
        map[0]++;

        // 遍历数组中的每个元素
        for (auto n : nums) {
            // 更新前缀和,sum 记录到当前位置的数组元素的累加和
            sum += n;

            // 判断当前前缀和减去 k 的值是否在哈希表中
            // 如果存在,说明找到了一个子数组,其和为 k
            if (map.count(sum - k)) {
                // 如果找到了这样的前缀和,累加它的出现次数到结果中
                // 这意味着存在 map[sum - k] 个子数组的和等于 k
                res += map[sum - k];
            }

            // 更新哈希表,记录当前前缀和 sum 的出现次数
            // 如果 sum 已经存在,次数加 1;否则新增该前缀和,次数为 1
            map[sum]++;
        }

        // 返回最终找到的子数组个数
        return res;
    }
};

总结

1.前缀和:

我们用一个变量 sum 来记录当前元素之前所有元素的累加和,也就是前缀和。前缀和可以帮助我们快速计算某一段子数组的和。

2.哈希表的作用:

我们使用一个哈希表 map 来存储前缀和出现的次数。这样,当我们计算到某个位置时,可以通过查找 sum - k 是否存在于哈希表中,来确定之前是否有一段子数组的和等于 k。

3.子数组和等于 k 的判断:

对于每个元素,计算当前前缀和 sum。我们想找到某一段子数组的和等于 k,可以用当前前缀和减去目标值 k,如果 sum - k 出现在哈希表中,意味着从某个起始位置到当前的位置的子数组和为 k。因此,将其出现的次数累加到结果中。

4.特殊处理:

在一开始,我们往哈希表中加入了 map[0] = 1,这是为了处理前缀和刚好等于 k 的子数组(即从数组开始的子数组)的情况。

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

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

相关文章

源码分析:LinkedList

一、LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。 不过&#xff0c;我们在项目中一般是不会使用到 LinkedList 的&#xff0c;需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替&#xff0c;并且&#x…

7-8 哈利·波特的考试

题意简述&#xff1a; 给一个图&#xff0c;求一个点&#xff0c;该点离其他点最小距离的最大值 最小。 输入样例: 6 11 3 4 70 1 2 1 5 4 50 2 6 50 5 6 60 1 3 70 4 6 60 3 6 80 5 1 100 2 4 60 5 2 80输出样例: 4 70 注意&#xff1a;0x3f不能写在判断里面&#xff0c;…

【大模型训练】Flash Attention详解

文章目录 前言预备知识FlashAttention1传统Attention计算方式FlashAttention1的基本原理除去Softmax操作的分块计算Softmax分块计算Attention分块计算 FlashAttention2参考资料 前言 FlashAttention系列工作&#xff0c;是一种加速注意力计算方法&#xff0c;目前已经应用在&a…

解决TensorFlow-GPU安装错误:Python版本兼容性与环境配置问题

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 从错误信息中可以看到&#xff0c;tensorflow-gpu 安装时出现了 packaging.requirements.InvalidRequirement 错误&#xff0c;具体是因为解析 Python 版本时出现了问题。这通常是由于环…

OpenAI全新发布o1模型:开启 AGI 的新时代

OpenAI全新发布o1模型&#xff1a;开启 AGI 的新时代 欢迎关注【youcans的AGI学习笔记】原创作品 2024年9月13日&#xff0c;OpenAI新模型o1 正式发布。o1 在测试化学、物理和生物学专业知识的基准 GPQA-diamond 上&#xff0c;全面超过了人类博士专家。 OpenAI 宣称&#xff…

CANFD芯片应用中关键功能和性能指标分析

CAN FD芯片通信速率高达5Mbps&#xff0c;需要线缆少传输距离较远&#xff0c;在汽车、工业、宇航、能源等领域应用越来越广。 1&#xff09;汽车工业&#xff1a;汽车内部电子系统日益复杂&#xff0c;需要高速、可靠的数据传输来确保车辆的安全和性能。CAN FD通信提供了更高…

R数据对象快速保存与读取:qs包

qs&#xff1a;R对象的快速序列化 qs是一个R语言包&#xff0c;使用qs可以快速地从磁盘中保存和读取对象。** 它的主要目的是替换R中的saveRDS和readRDS函数&#xff0c;提供了一个更加快速而完整的数据读写方法。 ** 受到fst的启发&#xff0c;qs通过lz4/zstd库使用了类似的块…

人工智能和机器学习:探讨人工智能和机器学习的最新发展、应用、挑战和未来趋势

人工智能和机器学习是当前科技领域的热点话题&#xff0c;其最新发展、应用、挑战和未来趋势备受关注。 最新发展&#xff1a; 人工智能和机器学习技术在近年来得到了快速发展&#xff0c;尤其是深度学习技术的广泛应用。例如&#xff0c;深度学习在图像识别、语音识别、自然语…

docker入门安装及使用

docker概述 docker是一种容器技术&#xff0c;它提供了标准的应用镜像&#xff08;包含应用和应用多需要的依赖&#xff09;&#xff0c;因此&#xff0c;我们可以非常轻松的在docker中安装应用&#xff0c;安装好的应用相当于一个独立的容器 如下图所示&#xff0c;为docker中…

机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局

今天我们一起学习一篇最近发表在Journal for immunotherapy of cancer &#xff08;IF 10.9&#xff09;上的文章&#xff0c;Machine learning for prediction of immunotherapeutic outcome in non-small-cell lung cancer based on circulating cytokine signatures[基于循环…

制证书、制电子印章、签章 -- 演示程序说明

ofd签章系统涉及证书的制作、电子印章制作、签章、验章等环节。关于ofd签章原理&#xff0c;本人写过多篇文章进行了阐述; 见文章《ofd板式文件 电子签章实现方法》、《一款简单易用的印章设计工具》、《签章那些事 -- 让你全面了解签章的流程》。 为了进一步加深对签章过程的理…

基于Spring Security OAuth2认证中心授权模式扩展

介绍 Spring Security OAuth2 默认实现的四种授权模式在实际的应用场景中往往满足不了预期。 需要扩展如下需求&#xff1a; 手机号短信验证码登陆微信授权登录 本次主要通过继承Spring Security OAuth2 抽象类和接口&#xff0c;来实现对oauth2/token接口的手机号短信的认证…

GD32F4开发 -- FATFS移植

之前已经讲了 GD32F4开发 – FATFS文件系统 现在将其一直到我的工程。 一、移植 在工程里创建FATFS文件夹。 移植正点原子 实验39 FATFS实验里的代码。 移植完后如下图&#xff1a; 注意&#xff1a;ffconf.h文件&#xff0c;找到对应宏并按照需求修改。 二、创建 FATFS 分…

最新中科院预警名单发布,多本高分区期刊被标记“On hold”(附20-24年所有名单)

2024年2月&#xff0c;期刊分区表团队发布2024年度《国际期刊预警名单 》。 最新版的《国际期刊预警名单》共有24本期刊&#xff0c;较23年版本的28本减少了4本&#xff0c;全部预警期刊当中&#xff0c;医学类数量最多&#xff0c;达11本。期刊JOURNAL OF BIOMATERIALS AND T…

高效率免费创作文章,4款ai写作生成器来帮忙

高效率免费创作文章&#xff0c;这对于每个创作者来说是非常不错的方法&#xff0c;即能提高创作效率&#xff0c;而且还能节省文章创作成本&#xff0c;但是想要高效率免费创作我们就需要找到相应的ai写作生成器来帮忙。因为如果是人工创作文章就需要耗费时间成本与人力成本的…

在pycharm终端中运行pip命令安装模块时,出现了“你要如何打开这个文件”弹出窗口,是什么状况?

这种情况发生在Windows系统上&#xff0c;当在PyCharm终端中运行pip命令安装模块时&#xff0c;如果系统无法确定要使用哪个程序打开该文件&#xff0c;就会出现“你要如何打开这个文件”弹出窗口。 解决方法是&#xff1a; 选择“查找一个应用于此文件”的选项。在弹出的窗口…

C++与C语言的区别

前言 本文主要用C语言和C做对比来学习C&#xff0c;便于个人理解。C包含C语言&#xff0c;是对C语言的扩展&#xff0c;在C中&#xff0c;支持C语言的语法使用&#xff0c;C是C语言的超集 一、C与C语言的区别 C语言简单高效&#xff0c;适合低级系统编程和硬件相关的开发。…

揭秘Web3新纪元:算力共享平台如何重塑数字世界的力量源泉

目录 一、Web3:算力共享的新舞台 二、技术革新:解锁算力的无限潜能 三、应用场景:算力如何改变世界 四、未来展望:算力共享的无尽可能 在区块链技术的浪潮中,Web3.0的曙光正引领我们迈向一个前所未有的数字时代。而在这场变革的洪流中,基于Web3的算力共享平台犹如一股…

Redis集群_主从复制

Redis集群基本概念 在实际项目中&#xff0c;一般不会只在一台机器上部署redis服务器&#xff0c;因为单台redis服务器不能满足高并发的压力&#xff0c;另外如果该服务器或者redis失效&#xff0c;整个系统就可能崩溃项目里一般会用主从复制的模式来提升性能&#xff0c;用集…

“精装朋友圈”的年轻人,开始在40度高温买羽绒服

文 | 螳螂观察 作者 | 如意 人生一世&#xff0c;苦了自己也不能苦朋友圈。 这届的年轻人&#xff0c;无论人生有多“毛坯”&#xff0c;都有一个一生要强的朋友圈&#xff0c;而且“装修”朋友圈还有一套哲学&#xff0c;信奉图片精修&#xff0c;排版讲究&#xff0c;文案…