leetcode 560.和为k的子数组 | 叱诧风云 !前缀和 + 哈希表优化!

. - 力扣(LeetCode)

这道题目的解法我个人认为是非常的巧妙的,因为一开始我是没有想到用前缀和和哈希表来解决,所以今天在这里写一篇题解,来回顾也算是巩固一下我对于这道题目的理解。

首先我先来解释一下,用前缀和的思路是什么样的,我们知道这道题目是让你计算一个连续的子数组,也就是该数组中一连串的元素值的和,判断他们的和是不是等于k,讲到这里,你不是有一些启发呢?

来看一个例子吧,拿题目的例子举例 

nums数组是这样的  【1 ,2  ,3】 前缀和数组 pre 是这样的 【1, 3, 6】;k的值为2

你看如果我们将pre[1] - pre[0] 是不是就等于2,是不是就等于我k的值。而你再仔细想想pre代表的是前缀和,pre[1]是不是就等于pre[0] + nums[1]啊,所以这不就是相当于我找到了一个连续的和为k的子数组了吗,这就是前缀和的意思,那么哈希表优化又是怎么实现的呢

这里我们先来看一个式子 假设 pre[i] - k = pre[j] ,这个式子是不是就代表在数组中i到j之间的元素的和就等于k,也就是说i到j之间的元素是满足我们的条件的,那这里我们每次计算的实际是我们当前的遍历的位置的前缀和 - k,我们是看这个式子的值是不是我这个数组的前缀和,所以这个时候难免就会算出多个前缀和一样的 ,因为数组中的元素有正有负,但是虽然他们的前缀和一样,但是他们所代表的子数组可不一样,所以这里我们就考虑用unordered_map来记录我们遍历过的前缀和,到时候只需要加上对应的val值就可以了,而且这里的前缀和我们只需要用一个数来表示就可以了,不用真的用一个数组来表示,下面来看具体的代码的实现

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int cnt = 0; int pre = 0;unordered_map<int, int> m;m.insert(pair<int, int>(0, 1));for (int i = 0; i < nums.size(); i++) {pre += nums[i];auto p = m.find(pre - k);if (p != m.end()) {cnt += p->second;}auto q=m.find(pre);if(q==m.end()) m.insert(pair<int,int>(pre,1));else q->second++;}return cnt;}
};

 cnt就是用计数的,用来返回最后的最终的结果,pre就是用来表示当前位置的所对应的前缀和,因为当前位置的前缀和就等于前面一个位置的前缀和加上当前的元素的值,并且上一个前缀和都记录在map里,当然是unordered_map,这里还需要注意的是一开始要加入零到map里,这就不用多说了,只要那个式子的值在map里能被找到就加上val的值,然后再将当前的前缀和,加入到map里,最后返回计数器cnt即可

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

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

相关文章

linux中的调试工具gdb

目录 1.背景知识补充 2.使用 知识补充 1.背景知识补充 1.gcc下编译默认是release方式发布的&#xff0c;无法直接进行调试 如果要以debug方式发布&#xff0c;需要携带-g 可以使用grep查询 因为携带debug信息&#xff0c;其文件体积要大一些 2.使用 1.gdb 可执行程序 …

hibernate:hibernate初始化加载类

目录 一、SessionFactory 接口 1、初始化hibernate 2、获取SessionFactory实例 3、创建获取Session 4、关闭Session和SessionFactory 最终配置 二、Session 接口 1、get()方法和load()方法&#xff1a; 2、查询 3、保存 4、删除 5、更新 6、一个完整的DAO接口实现类 …

北邮《计算机网络》网络层笔记

文章目录 单词复习网络层前言路由算法&#xff08;构造路由表的算法&#xff09;静态路由算法自适应算法 拥塞控制QoS 服务质量&#xff08;小小的一节&#xff09;网络互联&#xff08;还是小小的一节&#xff09;Internet 单词复习 estimates boot off-line in advance refl…

【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(上,非结构化剪枝)

文章目录 0. 前言1. 剪枝prune主要功能分类2. torch.nn.utils.prune中的方法介绍3. PyTorch实例3.1 BasePruningMethod3.2PruningContainer3.3 identity3.4random_unstructured3.5l1_unstructured 4. 总结 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己…

AI办公自动化:免费批量将英语电子书转成有声书

Edge-TTS是由微软推出的文本转语音Python库&#xff0c;通过微软Azure Cognitive Services转化文本为自然语音。可以作为付费文本转语音TTS服务的替代品&#xff0c;Edge-TTS支持40多种语言和300种声音&#xff0c;提供优质的语音输出 。 edge-tts支持英语、汉语、日语、韩语、…

基于Netron库的PyTorch 2.0模型可视化

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 前面章节带领读者完成了基于PyTorch 2.0的MNIST模型的设计&#xff0c;并基于此完成了MNIST手写体数字的识别。此时可能有读者对我们…

C语言结构体包含结构体

C语言结构体可以包含另一个结构体&#xff1b; 下面通过一个例子看一下&#xff1b; struct Date {int day;int month;int year; };struct Person {char *name;struct Date birthday; }; ...... void CTestView::OnDraw(CDC* pDC) {CTestDoc* pDoc GetDocument();ASSERT_VAL…

备战秋招day3

碎碎念&#xff1a; 今天有个面试&#xff0c;学校这里还有实训。 今日任务&#xff1a;算法&#xff0b;mysql知识点补充 算法 24. 两两交换链表中的节点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* List…

MySQL-索引:聚集索引、覆盖索引、组合索引、前缀索引、唯一索引

文章目录 MySQL-索引&#xff1a;聚集索引、覆盖索引、组合索引、唯一索引1、聚集索引2、覆盖索引3、组合索引4、唯一索引 MySQL-索引&#xff1a;聚集索引、覆盖索引、组合索引、唯一索引 1、聚集索引 在数据库中&#xff0c;聚集索引决定了表数据行的物理存储顺序。在InnoD…

C语言 | Leetcode C语言题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; void swap(int* a, int* b) {int t *a;*a *b, *b t; }void reverse(int* nums, int start, int end) {while (start < end) {swap(&nums[start], &nums[end]);start 1;end - 1;} }void rotate(int* nums, int numsSize, int…

国内邮件推送如何避免拦截?内容优化技巧?

国内邮件推送的平台怎么选择&#xff1f;如何提高邮件推送效果&#xff1f; 邮件营销是企业与客户沟通的重要方式&#xff0c;但在国内邮件推送过程中&#xff0c;邮件被拦截的问题屡见不鲜。为了确保邮件能够顺利送达目标用户&#xff0c;AokSend将探讨一些有效的策略&#x…

【Android】实现图片和视频混合轮播(无限循环、视频自动播放)

目录 前言一、实现效果二、具体实现1. 导入依赖2. 布局3. Banner基础配置4. Banner无限循环机制5. 轮播适配器6. 视频播放处理7. 完整源码 总结 前言 我们日常的需求基本上都是图片的轮播&#xff0c;而在一些特殊需求&#xff0c;例如用于展览的的数据大屏&#xff0c;又想展…

跟着DW学习大语言模型-什么是知识库,如何构建知识库

建立一个高效的知识库对于个人和组织来说非常重要。无论是为了个人学习和成长&#xff0c;还是为了组织的持续创新和发展&#xff0c;一个完善的知识管理系统都是不可或缺的。那么&#xff0c;如何建立一个高效的知识库呢&#xff1f; 在建立知识库之前&#xff0c;首先需要确定…

第3章 小功能大用处-事务与Lua

为了保证多条命令组合的原子性&#xff0c;Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。 首先简单介绍Redis中事务的使用方法以及它的局限性&#xff0c;之后重点介绍Lua语言的基本使用方法&#xff0c;以及如何将Redis和Lua脚本进行集成&#xff0c;最后给出Red…

项目实训-vue(十三)

项目实训-vue&#xff08;十三&#xff09; 文章目录 项目实训-vue&#xff08;十三&#xff09;1.概述2.处理按钮 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.处理按钮 实现了图片的上传之后&#xff0c;还需要设置具体的上传按钮。 这段代码使用 Element UI 的 …

Linux之磁盘管理

最近工作中&#xff0c;进行需要进行项目部署、排查问题。而磁盘又是其中绕不开的一个环节。今天就来整理一下磁盘的操作。 1、查看磁盘使用情况 df -h文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 2.0G 0 2.0G 0% /dev tmpfs …

Spring学习02-[Spring容器核心技术IOC学习]

Spring容器核心技术IOC学习 什么是bean?如何配置bean?Component方式bean配合配置类的方式import导入方式 什么是bean? 被Spring管理的对象就是bean,和普通对象的区别就是里面bean对象里面的属性也被注入了。 如何配置bean? Component方式、bean配合配置类的方式、import…

C语言 | Leetcode C语言题解之第190题颠倒二进制位

题目&#xff1a; 题解&#xff1a; const uint32_t M1 0x55555555; // 01010101010101010101010101010101 const uint32_t M2 0x33333333; // 00110011001100110011001100110011 const uint32_t M4 0x0f0f0f0f; // 00001111000011110000111100001111 const uint32_t M8…

【containerd】Containerd高阶命令行工具nerdctl

前言 对于习惯了使用docker cli的用户来说&#xff0c;containerd的命令行工具ctr使用起来不是很顺手&#xff0c;此时别慌&#xff0c;还有另外一个命令行工具项目nerdctl可供我们选择。 nerdctl是一个与docker cli风格兼容的containerd的cli工具。 nerdctl已经作为子项目加入…

【区分vue2和vue3下的element UI Statistic 统计数值组件,分别详细介绍属性,事件,方法如何使用,并举例】

Element UI 是一个为 Vue.js 设计的 UI 组件库&#xff0c;但截至当前&#xff08;2023年&#xff09;&#xff0c;Element UI 主要针对 Vue 2.x 进行了设计和开发&#xff0c;并没有官方的 Vue 3.x 版本。然而&#xff0c;Vue 3.x 带来了许多新的特性和改进&#xff0c;因此一…