差分数组详解,一维二维差分

文章目录

  • 差分数组
    • 引言
    • 差分数组的定义
    • 二维差分数组
      • 二维差分数组代码实现
    • 总结
    • OJ练习

差分数组

引言

如果给你一个包含500个元素的数组,让你把从第一个元素到第100个元素的值都加上1,你会毫不犹豫的说枚举!那么如果给你一个包含5000万个元素的数组,让你把从第一个元素到第1000万个元素的值都加上1,你会怎么做?

此时你应该怎么做?如果再说暴力枚举的话,那么可就有点太繁重了。为了解决这类进行大区间相同操作,我们有一种较好的解决方案–差分数组。

差分数组的定义

差分数组是在原数组的基础上加以魔改的。给定数组arr,我们定义数组diff,其中

i=0 , diff[ i ] = arr[ 0 ]
i >= 1 , diff[ i ] = arr[ i ] - arr[i - 1]

我们把原来数组的每个位置上的元素和前一个元素作差得到的新数组称为差分数组(difference array),差分数组本质上就是前缀和的逆运算。

但这跟我们要解决的大区间相同操作问题又有什么关系呢?

我们先来分析差分数组的特点,diff[ i ] = arr[ i ] - arr[ i - 1 ],那么我们如果要求arr[ i ]不就是从第0个元素一直累加到第i - 1个元素吗?

假如我们有如下数组arr[] = {2,3,6,7,11,12,15,14,9}

我们要求把下标4–8的元素都加上1,我们发现即然第i个元素是下标0到i累加的结果,那么我们如果给第0个元素加上1,就能满足区间0到i上的元素全都加1,同样的如果我们要把区间4-8的元素都加1,我们只需要把下标4及之后的加1,下标9及之后的减一即可

如图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们发现下标4到9的diff值推算出来的原arr值都完成了加1

如果我们还想实现随机读取arr值的操作,可以再增添一个前缀和数组

一维差分数组代码实现

二维差分数组

我们是否可以实现一个二分差分数组从而实现对于矩阵内的元素快速修改呢?

答案是,当然可以。

当然这需要你对二维前缀和有所了解:见:前缀和详解,朴素前缀和,前缀和变形,二维前缀和-CSDN博客

了解了二维前缀和后,我们知道对于左上角[0,0]右下角[i,j]的前缀和有:

注意sum[i+1][j+1]为左上角[0][0]到右下角[i][j]的和
s u m [ i + 1 ] [ j + 1 ] = s u m [ i + 1 ] [ j ] + s u m [ i ] [ j + 1 ] − s u m [ i ] [ j ] + g r i d [ i ] [ j ] . sum[i+1][j+1]=sum[i+1][j]+sum[i][j+1]−sum[i][j]+grid[i][j]. sum[i+1][j+1]=sum[i+1][j]+sum[i][j+1]sum[i][j]+grid[i][j].
我们一维差分中有如下初始化:

i=0 , diff[ i ] = arr[ 0 ]

i >= 1 , diff[ i ] = arr[ i ] - arr[i - 1]

实际上我们不需要这样初始化,只需要将差分数组diff初始化0,在diff上区间修改,查询arr[i]就返回arr[i] + presum(diff[i])即可

由于利用差分数组查询

那么对于我们二维差分来讲,我们开一个差分矩阵diff[][],当我们对矩阵grid[i][j]左上角[x][y]到右下角[i][j]的元素区间加上k时,结合我们的二维前缀和公式,应该对diff做如下操作:
d i f f [ x ] [ y ] + = k ; d i f f [ x ] [ j + 1 ] − = k ; d i f f [ i + 1 ] [ y ] − = k ; d i f f [ i + 1 ] [ j + 1 ] + = k ; diff[x][y]+=k;\\ diff[x][j + 1]-=k;\\ diff[i + 1][y]-=k;\\ diff[i + 1][j + 1]+=k; diff[x][y]+=k;diff[x][j+1]=k;diff[i+1][y]=k;diff[i+1][j+1]+=k;
对于这个公式又有什么含义呢?

diff[x][y]+=k造成的影响是矩阵grid从左上[x][y]到右下[m-1][n-1]的元素都会加上k,因为我们求grid[i][j]时需要求diff的前缀和

但是我们只希望左上角[x][y]到右下角[i][j]的元素区间加上k时,所以第2、3行的含义为

令左上角[x][j+1]到右下角[m-1][n-1]都减去k,令左上角[x+1][j]到右下角[m-1][n-1]都减去k

此时左上角[i+1][j+1]到右下角[m-1][n-1]状态是加了一次k减了两次k,其余区间修改都达到预期,所以我们第四行

令左上角[i+1][j+1]到右下角[m-1][n-1]都加上k就保证了区间修改只涉及左上角[x][y]到右下角[i][j]

二维差分数组代码实现

前面说了,我们差分数组只需要开一个数组维护修改值,查询矩阵值的时候用修改值前缀和加上原值即可,所以diff初始为0

同时为了前缀和计算没有区间越界,我们开diff时开(m + 2) * (n + 2)大小(mn为原矩阵行列数目)

由于题目一般涉及到对二位差分求前缀和操作的时候一般都是离线算法,所以我们只给出求diff前缀和的代码

代码如下:

void update(int x , int y , int i  , int j , int k)
{diff[x + 1][y + 1]+=k;diff[i + 2][y + 1]-=k;diff[x + 1][j + 2]-=k;diff[i + 2][j + 2]+=k;
}
void presum()//处理前缀和
{for(int i = 0 ; i < m ; i++)for(int j = 0 ; j < n ; j++){diff[i + 1][j + 1] += diff[i + 1][j] + diff[i][j + 1] - diff[i][j];
}

总结

通过差分数组我们可以快速实现区间相同操作,只需要改变区间左端点和右端点的下一个位置即可

差分数组常用于区间修改、离线查询等情况

OJ练习

1109. 航班预订统计
2406. 将区间分为最少组数
2381. 字母移位 II
2772. 使数组中的所有元素都等于零
2528. 最大化城市的最小供电站数目
2132.用邮票贴满网格图

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

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

相关文章

03 python循环语句

3.1while循环基本语法 # 演示while循环的基础应用i0 while i<100 :print(不到100)i 1while循环基本案例 import random num random.randint(1, 100) count 0 while True:guess_num int(input(随机输入数字&#xff1a;))count 1if guess_num num :print(jie shu)br…

qiankun中主系统启动子系统本地静态图片加载404或者跨域问题

由于本地启动主系统和子系统&#xff0c;如果主系统内不放子系统的图片就会导致主系统访问不到子系统的图片 对于这个问题有三种解决方案&#xff0c;这里一一说明 1、第一种也是我常用的&#xff0c;就是把子系统中的静态图片全部转为base64这样通过主系统访问的时候就不是通…

为什么我的流量卡流量没有全部到账?是什么情况?

为什么我的流量卡流量没有全部到账&#xff1f;是什么情况&#xff1f; 网上的的流量套餐虽然便宜&#xff0c;但是有网友却反应&#xff0c;流量卡在激活之后出现“购买的套餐与实际流量不符合”的情况&#xff0c;这到底是什么原因呢&#xff1f; “流量卡和实际流量不符”&a…

HAAS 哈斯机床 读写刀补数据

哈斯机床不管是串口机床还是网口机床 都提供了Q命令 可以使用Q命令 进行刀具补偿的读取和写入 最多支持200把刀的 读取和写入

beanshell、jcef

BeanShell BeanShell是一个小型嵌入式Java源代码解释器&#xff0c;具有对象脚本语言特性&#xff0c;能够动态地执行标准JAVA语法。 BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序&#xff0c;还可以在运行过程中动态执行你java应用程序执行java代码。因为Bea…

如何在 VeriStand 中设置反射内存通道

环境 硬件 cPCI-5565PIORC 软件 VeriStand 我正在设置我的反射内存 PXI 卡&#xff08;例如 cPCI-5565PIORC&#xff09;。 我可以在我的 PXI 系统之间使用反射内存发送/接收什么&#xff1f; 如何设置我的 PXI 系统之间共享的通道&#xff1f; 使用反射内存&#xff0c;您…

水闸水雨情监测设施建设项目

功能设计 在水闸上、下游挡墙外侧各安装1套雷达水位计&#xff0c;水闸屋顶布置个雨量计&#xff0c;水位及雨量监测数据的采集与传输主要是实时的完成水位、雨量数据的采集与处理&#xff0c;并按照设定的工作方式、时间间隔、增量范围将数据上传至扬压力监测站边缘计算终端&…

数字电子技术期末知识点总结

文章目录 时序逻辑电路时序电路的分析同步时序电路的分析例子1&#xff08;有输入输出&#xff09;例子2 &#xff08;只有输出&#xff09;例子3&#xff08;没有输入、输出&#xff09; 异步时序电路的分析例子1 小结 时序电路的设计同步时序电路的设计串行数据检测器JK 触发…

【前端】HTML5 CSS3新特性(学习笔记)

HTML5 一、H5新增的语义化标签 以前布局&#xff0c;我们基本用 div 来做。div 对于搜索引擎来说&#xff0c;是没有语义的。 <header>&#xff1a;头部标签<nav>&#xff1a;导航标签<article>&#xff1a;内容标签<section>&#xff1a;定义文档某…

jdk21升级,asm报错Unsupported class file major version 65

环境 jdk21升级&#xff0c;asm报错&#xff0c;spring-core版本5.3.18&#xff0c;项目springboot版本为2.6.6 报错明细 Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file ve…

QQ音乐评论爬虫程序【原创】

先找到一首歌&#xff0c;把请求参数替换到下面程序中 例如&#xff1a; ‘g_tk_new_20200303’: ‘5381’, ‘g_tk’:‘5381’, ‘topid’:‘102636799’, //歌曲ID ‘cv’:‘4747474’ … #此处修改请求的页数 if page >10: break import requests from urllib import p…

修改Element UI可清空Input的样式

如图所示&#xff0c;修改Input右侧的清空按钮位置&#xff1a; <el-input class"create-catalog-ipt"placeholder"请输入相关章节标题"v-model"currentCatalogTitle"clearable /> // SCSS环境 ::v-deep {.create-catalog-ipt {input {he…

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 &#xff1a; tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…

HTTP、HTTPS、SSL协议以及相关报文讲解

目录 HTTP/HTTPS介绍 HTTP/HTTPS基本信息 HTTP如何实现有状态 HTTP请求与应答报文 HTTP请求报文 HTTP响应报文 SSL协议 SSL单向认证 SSL双向认证 HTTP连接建立与传输步骤 HTTP访问全过程相关报文&#xff08;以访问www.download.cucdccom为例子&#xff09; DNS报文…

06_W5500_DHCP

1.DHCP协议介绍&#xff1a; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于自动分配IP地址和其他网络配置信息的协议。它允许网络中的设备&#xff08;如计算机、手机、打印机等&#xff09;在连接到网络时自动获取IP地址、子网掩码、默认网关、…

JavaEE:单例模式(饿汉模式和懒汉模式)精讲

前言 什么是单例模式&#xff1f; 其实用通俗的话就是程序猿约定俗成的一些东西&#xff0c;就比如如果你继承了一个抽象类&#xff0c;你就要重写里面的抽象方法&#xff0c;如果你实现了一个接口&#xff0c;你就要重写里面的方法。如果不进行重写&#xff0c;那么编译器就会…

2024上海智慧城市展会(世亚智博会)促进长三角地区智慧城市发展

上海市政府近期印发的《上海市进一步推进新型基础设施建设行动方案(2023-2026年)》标志着新一轮新基建的全面启动。市政府副秘书长、市发展改革委主任顾军指出&#xff0c;这一行动方案紧抓智能算力、大模型、数据要素、区块链、机器人等技术发展趋势和绿色低碳节能要求&#x…

【LeetCode:2132. 用邮票贴满网格图 | 二维前缀和 + 二维差分和】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

达索系统SOLIDWORKS 2024 Visualize新功能

SOLIDWORKS Visualize&#xff08;原名为 Bunkspeed&#xff09;是一整套独立的软件工具&#xff0c;Visualize模块主要是用于对SOLIDWORKS设计出的产品图进行渲染、做动画&#xff0c;方便用户更好的展示、宣传产品&#xff1b;以最快速、最轻松的方式创建专业的照片级图像、动…

基于YOLOv8深度学习的水稻害虫检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…