前缀和以及map混用,打开思路

news2024/11/15 13:23:02

补一个坑 

目录

以力扣560为例:

力扣1248,优美子数组

 力扣974 和可被 K 整除的子数组

力扣523.连续的子数组和


浅谈一下前缀和:

我们通过前缀和数组保存前 n 位的和,presum[1]保存的就是 nums 数组中前 1 位的和,也就是 presum[1] = nums[0], presum[2] = nums[0] + nums[1] = presum[1] + nums[1]. 依次类推,所以我们通过前缀和数组可以轻松得到每个区间的和

for(int i=0;i<nums.size();++i)
{
    presum[i+1]=presum[i]+nums[i];
}

下面说说map+前缀和

思路像极了两数之和的问题,找k存在否,我们找target-k就可以

以力扣560为例:

我们可以直接暴力ac,以前缀和加map就是,map存的是各个和以及他对应出现的次数

精华如下图:我们只要统计各个阶段前缀和出现的次数,只要有能和k组成新的前缀和的,那就说明k也是存在的,且presum-k的次数不就是k出现的次数吗,,还是两数之和的问题

至于给map初始0赋值,也是为了能让一开始找到前缀和等于k的位置能计算上,,这个初始化也是必须有的

map给在初始化的时候给0一个元素,,相当于那个前缀和数组的0号下标位置给个初始值

    int subarraySum(vector<int>& nums, int k) {
        int ans=0;
        unordered_map<int,int>mp{{0,1}};
        int sum=0;
        for(int i=0;i<nums.size();++i)
        {
            sum+=nums[i];
            
            if(mp.count(sum-k)) //就说明前面的值和k能组成现在的前缀和,说明这一部分k就是存在的
            {
                ans+=mp[sum-k];//记录有多少个前面部分能和k组成现在sum,这个次数也就是这一部分k出现的次数
            }
            mp[sum]++;//相当于各个前缀和的次数
        }
        
        return ans;
    }

上面这个代码模式可以说是所有map+前缀和的模板代码了

下面给出剩下常见的map+前缀和的问题:

力扣1248,优美子数组

求子数组里面有k个奇数的,,转换一下思路。我们可以把奇数转换为1,偶数是0.。那么整个数组就是0 1组合,,那么找奇数,不就是找子数组和等于k,因为只有奇数才是有值的,偶数0不起作用啊,,转换成这样了 

套用上面模板,如下ac:

    int numberOfSubarrays(vector<int>& nums, int k) {
        unordered_map<int,int>mp{{0,1}};
        int ans=0;
        int sum=0;

        for(int i=0;i<nums.size();++i)
        {
            sum+=nums[i]%2; //相当于奇数变1,偶数变0
            if(mp[sum-k])
            {
                ans+=mp[sum-k];
            }
            mp[sum]++;
        }
        return ans;
    }

 力扣974 和可被 K 整除的子数组

同样的模板,只不过数组里面有可能会有负数,所以在除的时候 做一个下标转换

我们只需要知道之前的前缀区间里含有相同余数 (key)的个数。则能够知道当前能够整除 K 的区间个数

啥意思k等于3,,假如当前我8对3余2,,我只要能找到比8小且+k等于8,且%3也等于2的说明, k就是能被整除的,比如5,,前面要是有个5,那么结果就能++一次

ac:

    int subarraysDivByK(vector<int>& nums, int k) {
        unordered_map<int,int>mp{{0,1}};
        int sum=0;
        int ans=0;
        for(int i=0;i<nums.size();++i)
        {
            sum+=nums[i];
            //当前 presum 与 K的关系,余数是几,当被除数为负数时取模结果为负数,需要纠正
            int key=(sum%k+k)%k; 
            //查询哈希表获取之前key也就是余数的次数
            if(mp.count(key))
            {
                ans+=mp[key];
            }
            mp[key]++;
        }
        return ans;
    }

力扣523.连续的子数组和

核心一句话:a−b的差值要是k的倍数,那么a除以k的余数必定等于b除以k的余数

也是上一题的核心

这题多了些判断条件

  1. 子数组的和本质其实就是两个前缀和的差值,而差值等于n*k,那么意味着这两个前缀和%k是一样的;
  2. 那么自然我们就可以保留一个map来记录(前缀和%k) 到对应位置的映射
  3. 一旦发现(当前前缀和%k)已经在map里存在,而且两者序号差距大于等于2(满足题目要求子数组大小至少为2),就返回成功
  4. 坑:需要考虑前缀和本身就可以被k整除,直接引入一个初始化0->-1,这样子是保证如序号1的时候1-(-1)=2 >=2 这个时候就可以返回结果了
  5. 坑:考虑k=0的边界情况
bool checkSubarraySum(vector<int>& nums, int k) {
        unordered_map<int,int>mp{{0,-1}};
         // 防止第一个数和第二个数的和直接是k
         //0 -1
       
        int sum=0;
        for(int i=0;i<nums.size();++i)
        {
              sum+=nums[i];
            int key=(sum)%k; //计算前缀和余数,拿余数去判断
            if(mp.count(key))
            {
                int pos=mp[key];
                if(i-pos>=2){
                    return true;
                }
            }
            else{
                mp[key]=i;
            }
        }
        return false;
    }

over...

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

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

相关文章

王道考研数据结构--3.双链表

目录 1.前言 2.代码难点 2.1双链表的插入和删除 3.代码函数 3.1双链表结构体定义 3.2双链表初始化函数 3.3双链表插入 3.4双链表节点删除 3.5双链表的遍历 4.全部代码 1.前言 日期&#xff1a;2023.6.21 书籍&#xff1a;2024年数据结构考研复习指导&#xff08;王道…

【计算机视觉】CVPR 23 | 视觉 Transformer 全新学习范式!用长尾数据提升ViT性能

文章目录 一、导读二、介绍三、方法四、总结 一、导读 论文地址&#xff1a; https://arxiv.org/abs/2212.02015代码链接&#xff1a; https://github.com/XuZhengzhuo/LiVT二、介绍 在机器学习领域中&#xff0c;学习不平衡的标注数据一直是一个常见而具有挑战性的任务。近…

JDK自带的构建线程池的方式之newScheduleThreadPool

顾名思义newScheduleThreadPool是一个定时任务的线程池&#xff0c;这个线程池可以定时一定周期去执行任务&#xff0c;也可以实现延迟多久去执行任务一次。 newScheduleThreadPool方法实现展示 基于查看这个方法不难发现&#xff0c;该方法是基于ScheduledThreadPoolExecutor…

基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步

这篇教程将展示如何基于 Flink CDC 快速构建 MySQL 到 Databend 的实时数据同步。本教程的演示都将在 Flink SQL CLI 中进行&#xff0c;只涉及 SQL&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 假设我们有电子商务业务&#xff0c;商品的数据存储在 My…

【深度学习】5-5 与学习相关的技巧 - 超参数的验证

超参数指的是&#xff0c;比如各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等。如果这些超参数没有设置合适的值&#xff0c;模型的性能就会很差。 那么如何能够高效地寻找超参数的值的方法 验证数据 之前我们使用的数据集分成了训练数据和测试数据&#xff0c…

WorkPlus AI助理正式上线!为企业打造定制化的AI私有助理

毋庸置疑&#xff0c;ChatGPT的应用充满无限的想象空间。但对于企业来说&#xff0c;使用时面临的最核心的问题就是“存在回答准确性不足”的弊端。那企业都想要通过GPT构建内容生态&#xff0c;在数字化时代保持行业领先地位。 企业都想要结合行业属性、业务需求等自身特点打…

【Flutter】Flutter 数据存储 Hive 的简要使用说明

文章目录 一、前言二、Hive 包的版本号三、Hive 简介1. Hive 是什么&#xff1f;2. Hive 的特点 四、Hive 的基本使用1. Hive 的安装2. Hive 的初始化3. 创建和打开 Hive 数据库4. 数据的存储和读取5. 数据的删除 五、总结 一、前言 &#x1f389;想要精通 Flutter&#xff0c…

是时候扔掉cmder, 换上Windows Terminal

作为一个Windows的长期用户&#xff0c;一直没有给款好用的终端&#xff0c;知道遇到了 cmder&#xff0c;它拯救一个习惯用Windows敲shell命令的人。 不用跟我安利macOS真香&#xff01;公司上班一直用macOS&#xff0c;一方面确实更加习惯windows下面学习, 另一方面是上课需要…

Phantomjs实现后端将URL转换为图片

PhantomJS简介 PhantomJS is a command-line tool. – 其实就是一个命令行工具 PhantomJS的下载地址&#xff1a; Windows:phantomjs-2.1.1-windows.zip Linux:phantomjs-2.1.1-linux-x86_64.tar.bz2;phantomjs-2.1.1-linux-i686.tar.bz2 MacOS:phantomjs-2.1.1-macosx.zip…

西门子Mendix 入门 2

今天还是一直下载失败&#xff0c;就算成功了&#xff0c;速度也只有几K&#xff0c;于是使用翻墙软件&#xff0c;最终下载成功 下载成功后重新点击edit in studio pro 出现如下页面 首先先关闭安全性 进行添加任务和管理任务 点击上方绿色箭头后点击View App 出现如下页面…

ESP32-WROOM-32 UDP单播透传AT指令例程

ESP32-WROOM-32 AT指令配置TCP通讯 ESP32-WROOM-32前言固件烧录测试AT指令UDP单播通讯\透传ESP32配置SoftAPESP32与手机间的UDP通讯与透传普通传输模式演示UDP透传演示 ESP32-WROOM-32 前言 上次演示了ESP32与手机的三种TCP连接与数据传输方法&#xff0c;现在接着上一篇“ESP…

第二章 数据结构(一)——链表,栈和队列与kmp

文章目录 链表栈和队列表达式运算 单调栈单调队列kmp链表练习题826. 单链表827. 双链表 栈和队列练习题828. 模拟栈3302. 表达式求值829. 模拟队列830. 单调栈154. 滑动窗口 kmp练习题831. KMP字符串 kmp虐我一下午 链表 若用链式结构实现链表&#xff0c;效率低&#xff0c;因…

软件开发流程

目录 软件软件开发流程的演变 瀑布模型敏捷模型 XPSCRUMDevOps 1.软件 与计算机系统操作有关的计算机程序、可能有的文件、文档及数据。 软件可以分为两种主要类型&#xff1a; 独立软件&#xff1a;独立软件是一种完整的应用程序&#xff0c;可以直接在计算机或移动设备上…

Android系统安全 — 6.2 Ethernet安卓架构

1. Android Ethernet架构介绍 整个Ethernet系统架构如下图所示&#xff1a; 以太网服务&#xff08;EthernetService&#xff09;的启动与注册流程&#xff1b;应用层调用使能ethernet功能的方法流程来分析&#xff0c;从应用层如何将指令一步一步传到底层kernel&#xff1b;…

SAAS-HRM系统概述与搭建环境

SAAS-HRM系统概述与搭建环境 学习目标&#xff1a; 理解SaaS的基本概念 了解SAAS-HRM的基本需求和开发方式掌握Power Designer的用例图 完成SAAS-HRM父模块及公共模块的环境搭建完成企业微服务中企业CRUD功能 初识SaaS 云服务的三种模式 IaaS&#xff08;基础设施即服务…

使用Windows To Go工具制作你的U盘系统【含下载Windows10系统镜像】亲测已成功23.06.21

WinToGo是一款辅助工具&#xff1a;专为能够让你将系统装进U盘&#xff0c;移动硬盘里&#xff0c;让你在任意电脑都能运行U盘里装的系统&#xff01; 一、下载&#xff0c;安装“Windows To Go”工具 1、下载Windows To Go工具 口袋系统WinToGo: 安装Win 10到U盘 2、双击Wi…

从0到1精通自动化测试,pytest自动化测试框架,assert断言(七)

目录 一、前言 二、assert 三、异常信息 四、异常断言 五、常用断言 一、前言 断言是写自动化测试基本最重要的一步&#xff0c;一个用例没有断言&#xff0c;就失去了自动化测试的意义了。什么是断言呢&#xff1f; 简单来讲就是实际结果和期望结果去对比&#xff0c;符…

三分钟学习一个python小知识2-----------我的对python的类(Class)和对象(Object)的理解

文章目录 一、类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;是什么&#xff1f;二、Python类和对象的实现1.定义类2.创建对象3.调用类的属性和方法 三、利用python实现了一个动物的类&#xff08;Animal&#xff09;和其两个子类&#xff08;Cat和Dog&…

年轻人存款难,要攒够多少存款才可以体面的养老,结论亮了

这个情况确实值得我们思考。年轻人的经济压力比较大,所以他们普遍存款比较少。而10万元确实是一个比较大的数目,对于一些年轻人来说可能确实很难达到。 然而,我认为这并不是一个“坎”。我们应该鼓励年轻人理财,增加存款,以便应对未来可能出现的各种经济问题。同时,我们…

定义一个一维数组存放10个整数,要求从键盘输入10个数,对其进行求和、求平均、求最大值/最小值及其位置的下标

目录 题目 分析思路 法一&#xff1a;在主函数直接编程 法二&#xff1a;用 调用函数 实现 代码 法一&#xff1a;在主函数直接编程 法二&#xff1a;用 调用函数 实现 题目 定义一个一维数组存放10个整数&#xff0c;要求从键盘输入10个数&#xff0c;对其进行求和、求…