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

前缀和二

  • 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.mzph.cn/web/17271.shtml

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

相关文章

Java语言ADR药物不良反应系统源码Java+IntelliJ+IDEA+MySQL一款先进的药物警戒系统

Java语言ADR药物不良反应系统源码JavaIntelliJIDEAMySQL一款先进的药物警戒系统源码 ADR药物不良反应监测系统是一个综合性的监测平台&#xff0c;旨在收集、报告、分析和评价药品在使用过程中可能出现的不良反应&#xff0c;以确保药品的安全性和有效性。 以下是对该系统的详细…

Modbus工业网关

随着工业自动化程度的不断提高&#xff0c;设备之间的数据通信与交互变得至关重要。在这一背景下&#xff0c;Modbus协议凭借其简单、可靠、开放的特点&#xff0c;成为了工业自动化领域中最常用的通信协议之一。而HiWoo Box网关作为一款支持Modbus协议的工业网关设备&#xff…

【全开源】防伪溯源一体化管理系统源码(FastAdmin+ThinkPHP和Uniapp)

一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff08;内置多种生成规则&#xff09;、批量大量导出防伪和溯源码码数据、支持代理商管理…

Springboot项目——博客平台

前言&#xff1a;为巩固之前学习的知识&#xff0c;同时锻炼自己的代码能力&#xff0c;项目经验&#xff0c;熟悉前后端交互方式等&#xff0c;特此完成一个博客平台系统。&#xff08;总之&#xff0c;为了学习&#xff0c;为了进步&#xff09; 博客平台&#xff1a;本项目…

网络安全的重要组成部分:数据库审计

数据库审计&#xff08;简称DBAudit&#xff09;以安全事件为中心&#xff0c;以全面审计和精确审计为基础&#xff0c;实时记录网络上的数据库活动&#xff0c;对数据库操作进行细粒度审计的合规性管理&#xff0c;对数据库遭受到的风险行为进行实时告警。它通过对用户访问数据…

线性稳压电路和开关稳压电路

稳压二极管稳压电路 电网电压增大&#xff0c;导到u1端的电压增大&#xff0c;从而使输出电压&#xff0c;稳压二极管两端的电压增大&#xff0c;稳压二极管两端电压增大&#xff0c;使流过的电注增大。那么&#xff0c;流过线性电阻R的总电流增大。 Ur电压增大&#xff0c;从…

PGP软件安装文件加密解密签名实践记录

文章目录 环境说明PGP软件安装PGP软件汉化AB电脑新建密钥并互换密钥对称密钥并互换密钥 文件加密和解密A电脑加密B电脑解密 文件签名A电脑签名文件B电脑校验文件修改文件内容校验失败修改文件名称正常校验 环境说明 使用VM虚拟两个win11,进行操作演示 PGP软件安装 PGP软件下…

AI赋能:人工智能技术驱动下的品牌海外市场精准分析与营销策略

随着全球化的加速和科技的飞速发展&#xff0c;品牌在海外市场的竞争愈发激烈。为了在竞争激烈的国际市场中脱颖而出&#xff0c;品牌需要更深入地了解海外消费者的行为、趋势和偏好。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理和分析…

【高阶数据结构(七)】B+树, 索引原理讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. B树讲解…

音视频开发9 FFmpeg 解复用框架说明,重要API说明

一&#xff0c;播放器框架 二 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a; 即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 媒体流&#xff08;Stream&#xff09;&#xff1a; 表示时间轴上的一段连续数据&#xff0…

HAL工程应该这样搭建~

目录 一、为何要自己手动搭建一个软件工程&#xff1f; 二、在Keil5STM32F429**平台下的软件工程搭建 三、打开Keil MDK5软件创建一个新工程 四、在各个文件夹下添加所需文件 五、在MDK工程下添加文件 六、在MDK下添加路路径 一、为何要自己手动搭建一个软件工程&#xff…

安泰电子:电压放大器有哪些特点

电压放大器是电子电路中常见的一种重要元件&#xff0c;其作用是将输入电压信号放大到更高的电压水平。它在各种应用中都扮演着关键的角色&#xff0c;从音频放大器到通信系统中的射频放大器都有广泛的应用。下面安泰电子将介绍电压放大器的特点&#xff0c;以便更好地理解它们…

python 办公自动化-生成ppt文本和图

最终样式 代码实现 # 可编辑折线+写入文字 成功 # 问题: 设置字体类型和加粗和字体为微软雅黑,是只改了字母和数字的字体,中文没变化 pip install pptx_ea_font 这个库可以解决这个问题 import pandas as pd import pptx_ea_font import matplotlib.pyplot as plt from pp…

嵌入式智能硬件茶杯垫的设计与实现方案

iCupBox简介 这是一款智能杯垫产品,基于GTD时间管理理念设计,目的是提醒人们专心工作和及时喝水休息,提高工作效率。 https://gitee.com/jiangtao008/iCupBox 开原许可协议:MIT 项目分为客户端APP和杯垫固件系统: 客户端APP,使用QML开发,集成GTD时间管理方法,与杯垫固…

让AI学相机对焦: Learning to AutoFocus

前言 分析来自谷歌发表在 CVPR 2020 上的论文 Learning to Autofocus &#xff1a;https://arxiv.org/pdf/2004.12260 目前网上对这篇论文的分析较少&#xff0c;有的分析并没有指出关键点&#xff0c;如&#xff1a;论文解读&#xff1a; Learning to AutoFocus-CSDN博客&am…

pytorch-16 复现经典网络:LeNet5与AlexNet

一、相关概念 对于&#xff08;10,3,227,227&#xff09;数据表示&#xff0c;10张3通道的图&#xff0c;图的大小&#xff08;特征数&#xff09;为227*227. 通道数&#xff1a;作为卷积的输入通道数和输出通道数。 特征数&#xff1a;特征图的大小 步长stride和填充padding&…

三相电子负载:行业前沿

三相电子负载是模拟电网中实际负载的装置&#xff0c;主要用于电源、电机、变压器等产品的测试和老化。随着科技的发展&#xff0c;三相电子负载在电力、通信、汽车电子、新能源等领域的应用越来越广泛&#xff0c;成为行业前沿技术之一。 三相电子负载在电源行业的应用非常广泛…

聚会活跃气氛神器小程序源码系统 各种小游戏 让聚会不再冷场 带源代码包以及安装搭建教程

系统概述 在社交聚会中&#xff0c;如何让气氛活跃起来一直是一个让人关注的问题。小编给大家分享一款聚会活跃气氛神器小程序源码系统。它不仅提供了丰富多样的小游戏&#xff0c;还带有源代码包和详细的安装搭建教程&#xff0c;让你轻松打造属于自己的聚会互动平台。 代码…

Qt 项目(CMake)支持多国语言(2024/05)

目录 1.在工程手动创建languages文件夹2.修改CMakeLists.txt3.在qml上随便添加一下文字内容4.执行CMake 参考:Qt 项目(CMake)设置国际化支持 1.在工程手动创建languages文件夹 2.修改CMakeLists.txt set(TS_FILES"${CMAKE_SOURCE_DIR}/languages/aidi_zh_CN.ts"&qu…

超声波清洗机哪家好一点?四款无比卓越精品不可错过

在日常生活中&#xff0c;眼镜成为了我们不可或缺的伙伴&#xff0c;无论是阅读书籍、工作还是享受自然风光&#xff0c;清晰的视野总是至关重要。然而&#xff0c;眼镜上不可避免地会沾染灰尘、油脂甚至细菌&#xff0c;影响我们的视觉体验。传统的眼镜清洗方法虽然简单&#…