【基础算法总结】前缀和二

news2024/7/6 18:07:34

前缀和二

  • 1.和为 K 的子数组
  • 2.和可被 K 整除的子数组
  • 3.连续数组
  • 4. 矩阵区域和

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.和为 K 的子数组

题目链接:560. 和为 K 的子数组

题目分析:

在这里插入图片描述
子数组是连续的!
在这里插入图片描述
算法原理:

解法一:暴力枚举

定位一个下标然后从前往后遍历,两层for循环把所有子数组都找出来,把和为k的数组个数统计一下。肯定能解决问题,但时间复杂度是O(N^2)。并且这道题要注意范围是从负数到整数,因此定位一个下标从前往后走,即使找到了也不能停下,还要继续往后面找。万一后面数是0呢,万一后面数加起来是0呢。所以每次都要找到结尾!

在这里插入图片描述
以前也做过找子数组和的问题,那个时候用的是滑动窗口,本质就是同向双指针,right不往回走,但是今天这道题就不行了,滑动窗口的使用:数组要具有单调性或者说数组内都是正整数(大于0)才能用!

这道题数组里面可能有0,可能有负数,现在left和right指向一个区间了,但是区间内部可能还有符合的,right必须要回去才行,因此 不能用滑动窗口优化。

在这里插入图片描述
解法二:前缀和

以i位置为结尾的所有子数组

我们暴力枚举是以某点为起点的子数组。这里我们以某点为结尾的子数组。
只看前面到这个点为结尾而不看从这个位置往后,也是可以把所有子数组都枚举出来的。那以某个点为结尾的子数组中找到和为K的子数组有多少个,然后把所有情况加起来。

在这里插入图片描述
我们把它抽象出来,先看以i为结尾的子数组,后面先不看

如果是直接从i往前找和等于K的就和暴力枚举没区别了,此时引入前缀和思想。当枚举到i位置时,我已经知道以i为结尾的前缀和,假设是 sum[i], 此时我们需要找一个区间和为K,那仅需找一个前缀和让它等于 sum[i]-K 不就可以了嘛 。

在这里插入图片描述

这样就转化为 在【0,n-1】区间内,有多少个前缀和等于 sum【i】- K
在这里插入图片描述

如果直接把前缀和数组搞出来然后找i位置之前有多少个前缀和等于sum[i]-k
,那还需要从前到i位置遍历,这样就比暴力枚举时间复杂度还高。没有必要。如果要快速查找一个东西可以使用哈希表。
在这里插入图片描述
因此解法二:前缀和+哈希表

细节问题:
1.前缀和加入哈希表的时机?

第一种就是把所有前缀和都算出来都加入到hash表在找,这种方式有问题,我要找i位置之前这样把i位置之后的和也加入到哈希表了,是有问题的。

在计算i位置之前,哈希表里面只保存 [0,i-1] 位置的前缀和,计算完i位置之和,才把i位置的前缀和加入哈希表。

2.不用真的创建一个前缀和数组,用一个变量 sum 来标记前一个位置的前缀和即可

3.如果到i位置整个前缀和等于K?
那是不是要去[0,-1] 去找0,但是没有这个区间,但是[0,i]等于k也是一种情况,因此hash表特殊处理 hash[0]=1

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;//统计前缀和出现次数
        hash[0]=1;

        int sum=0,ret=0;
        for(auto& x:nums)
        {
            sum+=x; //计算当前位置前缀和
            if(hash.count(sum-k)) ret+=hash[sum-k];//统计个数
            hash[sum]++;
        }
        return ret;

    }
};

2.和可被 K 整除的子数组

题目链接:974. 和可被 K 整除的子数组

题目描述:

在这里插入图片描述

这道题和上一道题没什么区别,一个让找和为k的子数组,一个让找能够被k整除的子数组。

算法原理:

解法一:暴力枚举
枚举出所有子数组,然后找到符合条件的子数组!

在说解法二之前有两个补充知识:

1.同余定理

在这里插入图片描述

2.C++,java 【负数 % 正数】的结果以及修正

在C++,java 中 负数 % 正数 = 负数 如果得到一个正数呢?
修正:(a%p+p)%p 负数->正数,正数即使多加了也会模掉结果不会变。

有了这两个就可以开始解法二了,这道题解法和前面一模一样

解法二:前缀和+哈希表

转化成以i结尾的子数组找子数组和能被k整除。
使用前缀和思想,得到以i为结尾的所有元素的和 sum[i] ,我们现在也知道i位置之前所有下标的前缀和,因此在i为结尾的子数组中找一个子数组和能被k整除,可以转换成 [0,i-1]找有多少个前缀和余数等于 (sum % k + k)% k (余数可能为负修正一下)

在这里插入图片描述
在使用哈希表 hash<int,int> 记录前缀和的余数 和 次数。
这里的细节问题和上面的一模一样。

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {

        unordered_map<int,int> hash;
        hash[0%k]=1; //0%k这个数的余数

        int sum=0,ret=0;
        for(auto& x: nums)
        {
            sum+=x;// 算出当前位置前缀和
            int mod=(sum%k+k)%k;//修正后的余数
            if(hash.count(mod)) ret+=hash[mod];//统计结果
            hash[mod]++;
        }
        return ret;

    }
};

3.连续数组

题目链接:525. 连续数组

题目描述:

在这里插入图片描述

题目很简单就是让找包含相同1和0个数的最大子数组的长度

算法原理:
这道题如果统计子数组中1和0个数,是很难的。对于这道题,我们可以使用 正难则反 ,正面解决麻烦转化一下在求解。
转化:
1.将所有的 0 修改成 -1
2.在数组中,找出最长的子数组,使子数组中所有元素的和为0
在这里插入图片描述

前面有道题是在数组种找和为k的子数组,这里解题思想是完全一样,转换成找和为0子数组。

解法:前缀和+哈希表

不过细节有些差别。

1.哈希表中存的是什么

这道题让找的是数组的长度。因此hash<int,int> 前面是前缀和,后面是下标

2.前缀和什么时候存入哈希表

在使用sum[i]之后,在丢入哈希表

3.如果有重复的 <sum,i> 怎么办
以i为结尾然后找的过程中出现以j为结尾的前缀和相等,但是因为我们要找到的是最长子数组长度,我们只保存前面的 <sum,j>

在这里插入图片描述

4.默认前缀和为0的情况,哈希表如何存

以i为结尾的子数组本身前缀和等于0,这时我们去的是【0,-1】区间找,以前存的是个数hash[0]=1默认有一个,今天这里是hash[0]=-1,存的是下标
在这里插入图片描述
5.长度如何计算

在这里插入图片描述

class Solution {
public:
    int findMaxLength(vector<int>& nums) {

        unordered_map<int,int> hash;
        hash[0]=-1; // 默认有一个前缀和为0的情况

        int sum=0,ret=0;
        for(int i=0;i<nums.size();++i)
        {
            sum+=(nums[i]==0?-1:1);
            if(hash.count(sum)) ret=max(ret,i-hash[sum]);
            else hash[sum]=i;
        }
        return ret;
    }
};

4. 矩阵区域和

题目链接:1314. 矩阵区域和

题目分析:

在这里插入图片描述
这道题让返回一个数组,数组内每个下标的和是某一个区域的和。具体如下
通过两个例子,就可以理解上面的意思
在这里插入图片描述

可以看到求answer数组每个下标的值其实就是在求mat子矩阵的和!
关于子矩阵的和前面我们写过一道二维数组前缀和模板,可以用哪里的思想。

算法原理:

解法:前缀和

不要死记模板,自己分析。
如果要求子矩阵D的和,我们算出A+B+C+D的和,然后减去A+B的和,再减去A+C的和,但是多减了A的和,因此在加上一个A的和,最终就是区域D的和。但是前提是要知道A+B的和,A+C的和。

在这里插入图片描述

因此预先处理一个前缀和数组

在这里插入图片描述
预处理之后就该使用数组了
在这里插入图片描述
不用死记硬背我们自己也是可以推出来的,这里【x1,y1】,【x2,y2】我们要根基题意看是哪里。

在这里插入图片描述
但这里有些问题,上面的前缀和数组我们是从数组下标从【1,1】开始的。所以公式没有越界情况。但是这道题数组下标是从0开始的!

对于一维数组下标从0开始好解决,我们直接对第一个位置特殊处理一下。对于二维数组呢。如果把模板改成从0下标开始边界太难控制 ,因此我们多申请一行一列!让下标从1开始,那样上面的公式也不用大改了。
然后我们改一下下标标映射关系

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m=mat.size(),n=mat[0].size();

        // 1.预处理前缀和数组
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i=1;i<=m;++i)
            for(int j=1;j<=n;++j)
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];

        // 2.使用
        vector<vector<int>> ret(m,vector<int>(n));
        for(int i=0;i<m;++i)
            for(int j=0;j<n;++j)
            {
                int x1=max(0,i-k)+1,y1=max(0,j-k)+1;
                int x2=min(m-1,i+k)+1,y2=min(n-1,j+k)+1;
                ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
            }

        return  ret;

    }
};

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

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

相关文章

记录一次内存取证

1.情景复现 我姐姐的电脑坏了。我们非常幸运地恢复了这个内存转储。你的工作是从系统中获取她所有的重要文件。根据我们的记忆&#xff0c;我们突然看到一个黑色的窗口弹出&#xff0c;上面有一些正在执行的东西。崩溃发生时&#xff0c;她正试图画一些东西。这就是我们从崩溃…

1824python进销存管理系统mysql数据库Django结构layUI布局计算机软件工程网页

一、源码特点 python Django进销存管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 开发环境pycharm mysql 5.0 到5.5 依赖包 Django…

2024电激世界脉动-中国汽车品牌全球化制胜手册

来源&#xff1a;奥美Ogilvy&#xff1a; 近期历史回顾&#xff1a; 2024中国宏观经济专题报告-数据要素市场建设 2023-2024年度报告.pdf 2024制药与生化医疗技术产业链白皮书.pdf 从可再生能源到绿氢-中国投资助力埃及能源转型.pdf 2024有机旅行中国行业指引.pdf 2024中国技术…

connection problem,giving up

参考&#xff1a; https://zhuanlan.zhihu.com/p/93438433 仅仅安装 sudo apt-get install xrdp 在用RDP远程的时候总是卡在登录界面&#xff0c;connection problem,giving up&#xff0c; some problem… 第一步&#xff1a; sudo apt-get install xserver-xorg-core sudo…

CC工具箱使用指南:【淹没区分析(BHM)】

一、简介 群友定制工具。 这个工具适用面比较小。 工具的应用场景如下&#xff1a; 提供一个淹没区范围&#xff0c;类型是面要素。统计这个范围内的一些线、面要素的面积或长度。 给定的几个数据有&#xff1a;耕地、永久基本农田、房台、道路&#xff08;线&#xff09;…

英语语法早操练-(上)

说起语法宝宝感觉心里苦。那么多语法注意点&#xff0c;哪个都放不到心里&#xff0c;句子表达还是错。这种情况是浪费了80%的时间做了达不到20%效果的事情。 要想写出没有语法错误的句子&#xff0c;那至少得知道词性和句子成分。 词性就是名词、动词、形容词、介词等 句子成分…

R实验 正交试验设计与一元线性回归分析

实验目的&#xff1a; 掌握正交试验设计记号的意义&#xff1b;掌握正交试验设计的直观分析和方差分析&#xff1b;掌握一元线性回归模型的相关概念&#xff1b;掌握最小二乘法的思想&#xff1b;掌握一元线性回归方程的显著性检验和预测。 实验内容&#xff1a; &#xff11;…

联想应用商店开发者常见问题FAQ

Phone/Pad应用常见问题 应用上传FAQ Q. 上传apk包时&#xff0c;提示“该包名已存在”如何处理&#xff1f; A&#xff1a;若应用包名出现冲突&#xff0c;请先核实该账号是否已存在该包名产品&#xff0c;若不在该账号下&#xff0c;请进行应用认领。 Q. 应用是否可以授权…

如何判断自己的逆商(AQ)高低?

什么是逆商&#xff1f; 逆商指的是人们在面临困难挫折时&#xff0c;如何摆脱困难和挫折的能力。逆商简称为AQ&#xff0c;也叫抗挫折能力。 逆商&#xff08;Adversity Quotient&#xff0c;简称AQ&#xff09;&#xff0c;是指个体面对逆境时的反应方式和应对能力&#xff…

wps能打开caj文件吗?CAJ应该如何打开?caj转pdf

问题1&#xff1a;wps能打开caj文件吗&#xff1f; WPS不能直接打开CAJ文件。 CAJ是中国知网开发的一种文件格式&#xff0c;主要用于存储学术文献&#xff0c;需要使用专门的阅读器才能打开。 问题2&#xff1a;CAJ应该如何打开&#xff1f; 要打开CAJ文件&#xff0c;你可…

3本救命神刊!录用率≥98%,非预警,最快2天录用!

本救命神刊&#xff0c;录用率高&#xff0c;无预警&#xff0c;14年期刊编辑全程保驾护航&#xff0c;省心省力助你快速发表&#xff01; 进展超顺 SSCI 社科类SSCI • 影响因子&#xff1a;3.0-4.0 • 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院3/4区 • Index&…

界面控件DevExtreme v23.2亮点 - 标签、表单、编辑器功能升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

Hadoop HA 搭建过程中报错:namenode格式化

问题描述&#xff1a; 在格式化namenode时&#xff0c;显示报错如下 2024-03-07 13:55:30,543 ERROR namenode.FSNamesystem: FSNamesystem initialization failed. java.io.IOException: Invalid configuration: a shared edits dir must not be specified if HA is not enab…

半藏酒业新零售分红制度拆解,起盘运营服务商

半藏酱酒招商模式&#xff0c;白酒合伙人模式&#xff0c;顶层模式设计 社群玩法用这几年的互联网词汇描述叫私域营销。虽然不走传统商超&#xff0c;酒桌之外很少能看到&#xff0c;但随着核心消费者裂变和流量汇聚&#xff0c;现在能见度越来越高&#xff0c;并溢出到达公域。…

盲人心理辅导课程:心灵的引路人

在这个快节奏的社会中&#xff0c;技术的每一次跃进都在悄然改变着人们的生活方式&#xff0c;尤其对于盲人群体&#xff0c;一款名为“蝙蝠避障”的辅助软件成为了他们探索世界的得力助手。通过实时避障与拍照识别功能&#xff0c;“蝙蝠避障”不仅保障了盲人朋友的日常安全&a…

哈根达斯线下连锁店后台管理系统原型

部件库预览链接&#xff1a;请与班主任联系获取原型文档 支持版本: Axrure RP 8 文件大小: 3MB 文档内容介绍 l原型目录 l原型界面 免费领取资料 添加班主任回复 “210407” 领取

【leetcode1944--队列中可以看到的人数】

有n人排成一个队列&#xff0c;从左到右编号为0到n-1&#xff0c;height数组记录每个人的身高&#xff0c;返回一个数组&#xff0c;记录每个人能看到几个人。 类比&#xff1a;山峰问题&#xff0c;高的后面的矮的看不见。 从后往前&#xff0c;最后一个元素入栈&#xff0c…

方正国际金融事业部副总经理白冰受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 方正国际软件&#xff08;北京&#xff09;有限公司金融事业部副总经理白冰先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“浅析多项目管理的成功因素”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xf…

LeetCode刷题之HOT100之最长回文串

2024/5/28 大家上午好啊&#xff0c;我又来做题了 1、题目描述 2、逻辑分析 题目要求找出最长的回文子串。我回去看了一下回文数字和回文链表这两道题。这个题目的思想其实跟以上两题也差不多&#xff0c;但是结合了最长子串这一概念。那么怎么解决这个题目呢&#xff1f;那么…

YOLOv8+PyQt5动物检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.猫狗猴检测YOLOv8&#xff08;https://mbd.pub/o/bread/mbd-ZpaTl51u&#xff09;_哔哩哔哩_bilibili 资源包含可视化的动物检测系统&#xff0c;基于最新的YOLOv8训练的动物检测模型&#xff0c;和基于PyQt5制作的可视化动物检测系统&#xff0c;包含登陆页面、注册页面和检…