盖子的c++小课堂——第二十四讲:差分数组

前言

嗨嗨嗨,这里是盖子的小课堂哟,这次更新主要是因为快放假了,时间多了,好嘞,废话不多说,点赞评论拿来吧你~

差分数组

一维差分数组

假设给你一个数组 nums ,先对区间 [a,b] 中每个元素加 3 ,在对区间 [c,d] 每个元素减 5 …… ,这样非常频繁的区间修改,常规的做法可以一个个计算。

public void increment(int[] nums, int a, int b, int k) {for (int index = a; index <= b; index++) {nums[index] += k;}}

频繁对数组的一段区间进行增加或减去同一个值,如果一个个去操作,很明显效率很差,我们可以使用差分数组,差分数组就是原始数组相邻元素之间的差。定义差分数组 d[n] ,我们可以得到: d[i] = nums[i] − nums[i−1] ,其中 d[0] = nums[0] ,如下图所示。

 我们可以看到原数组就是差分数组的前缀和。

nums[0] = d[0]num[3] = d[0] + d[1] + d[2] + d[3]

有了差分数组,如果对区间 [a,b] 每个元素加 3 ,不需要在一个个操作,只需要在两端修改即可,如下图所示。

d[a] += 3;d[b+1] -= 3;

 来看下代码:

public class DiffNums {​private int[] diff;// 差分数组。private int[] nums;// 原数组。​public DiffNums(int[] nums) {this.nums = nums;diff = new int[nums.length];diff[0] = nums[0];for (int i = 1; i < diff.length; i++)diff[i] = nums[i] - nums[i - 1];}​// 给区间[a,b]每个元素增加val(也可为负数)。public void increment(int a, int b, int val) {diff[a] += val;if (b + 1 < diff.length)diff[b + 1] -= val;}​// 返回结果数组。public int[] result() {nums[0] = diff[0];for (int i = 1; i < diff.length; i++)nums[i] = diff[i] + nums[i - 1];return nums;}}

二维差分数组

我们把一维差分数组看做是一条直线,只需要用后面的值减去前面的值就可以构造差分数组。而二维差分数可以把他看做是一个平面,如下图所示,他的定义如下:

d[i][j] = a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]

 ​如果想获取原数组,根据上面的公式可以得到:

a[i][j] = a[i-1][j]+a[i][j-1]-a[i-1][j-1]+d[i][j]

如下图所示,以 (x1,y1) 为左上角, (x2,y2) 为右下角构成一个区间,如果对这个区间内的每个元素增加 val ,只需要执行下面四步即可。

public void add(int x1, int y1, int x2, int y2, int val) {d[x1][y1] += val;// 增加S1d[x1][y2 + 1] -= val;// 减去S2d[x2 + 1][y1] -= val;// 减去S3d[x2 + 1][y2 + 1] += val;//加上S4}

 代码如下:

private int[][] d;// 差分数组。private int[][] a;// 原数组。​public TwoDiffNums(int[][] a) {this.a = a;int m = a.length;int n = a[0].length;d = new int[m][n];// 求差分数组。for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)add(i, j, i, j, a[i][j]);}​public void add(int x1, int y1, int x2, int y2, int val) {d[x1][y1] += val;if (y2 + 1 < d[0].length)d[x1][y2 + 1] -= val;if (x2 + 1 < d.length)d[x2 + 1][y1] -= val;if (x2 + 1 < d.length && y2 + 1 < d[0].length)d[x2 + 1][y2 + 1] += val;}​// 返回结果数组。public int[][] result() {for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[0].length; j++) {int x1 = i > 0 ? a[i - 1][j] : 0;int x2 = j > 0 ? a[i][j - 1] : 0;int x3 = i > 0 && j > 0 ? a[i - 1][j - 1] : 0;a[i][j] = x1 + x2 - x3 + d[i][j];}}return a;}

差分数组是与前缀和数组所对应的一种逆操作,类似于求导和积分,也就是说,对差分数组求前缀和,可以得到原数组,同样的,对前缀和数组求差分,也可以得到原数组。

差分数组的性质

 

当我们希望对原数组的某一个区间[l,r]施加一个增量inc时,差分数组d对应的变化是:d[l]增加inc,d[r+1]减少inc,并且这种操作是可以叠加的。

例如:有数组d=[1,2,3,4,5,6],对d[2]到d[4]之间的所有数加上3,变为d=[1,2,6,7,8,6],那么差分数组也就从[1,1,1,1,1,1]变成了[1,1,4,1,1,-2]。

也就是说,当我们需要对原数组的不同区间施加不同的增量,我们只要按规则修改差分数组即可。

总结

今天暂时先到这里,下次更新~拜拜

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

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

相关文章

C#中关于DataGridView行和列的背景色及列标题的背景颜色设置

1、DateGridView实现黑底红色&#xff0c;可通过设置、背景色、前景色和字体颜色、 默认列标题样式实现。 BackgroundColor设置背景色 GridColor设置网格线颜色 BorderStyle设置边框样式 RowHeadersVisables设置是否显示包含行标题的列 EnableHeadersVisualStyles设置为f…

WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

1、案例介绍 前面已经完成了25篇的文章介绍&#xff0c;概括起来就是从0开始&#xff0c;一步步熟悉了wpf的概念&#xff0c;UI布局控件&#xff0c;资源样式文件的使用&#xff0c;MVVM模式介绍&#xff0c;命令Command等内容&#xff0c;这节来完成一个实际的项目开发&#…

vue项目心得(复盘)

在编写项目过程中&#xff0c;首先是接手一个需要优化的项目&#xff0c;需要查看vue.config.js环境配置地址&#xff0c;确认好测试地址后进行开发&#xff0c;目前在开发过程中&#xff0c;遇到的最多的问题就是关于组件间的&#xff0c; 组件间传值 1、父组件异步传值&…

Helm-从0手动创建charts

Helm-从0手动创建charts 创建 chart 目录结构&#xff1a; mkdir my-nginx cd my-nginx创建 Chart.yaml &#xff1a; cat > Chart.yaml << EOF apiVersion: v2 appVersion: v1.0 description: A Helm chart for Kubernetes name: nginx-app version: 0.1.0 EOF创建…

从0开始学Git指令(2)

从0开始学Git指令 因为网上的git文章优劣难评&#xff0c;大部分没有实操展示&#xff0c;所以打算自己从头整理一份完整的git实战教程&#xff0c;希望对大家能够起到帮助&#xff01; 工作区&#xff08;Working Directory&#xff09; 就是你在电脑里能看到的目录&#x…

性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测…

dotdotdot插件快速实现多行文本的省略

jQuery.dotdotdot 前言 在“css新增文本样式&#xff08;完整&#xff09;”这篇&#xff0c;我们介绍了text-overflow属性省略多余的文本。用text-overflow属性可以直接省略单行文本&#xff0c;但省略多行文本&#xff0c;单独使用CSS是无法实现&#xff0c;今天我们介绍一…

RabbitMQ高级

文章目录 一.消息可靠性1.生产者消息确认2.消息持久化3.消费者确认4.消费者失败重试 MQ的一些常见问题 1.消息可靠性问题:如何确保发送的消息至少被消费一次 2.延迟消息问题:如何实现消息的延迟投递 3.高可用问题:如何避免单点的MQ故障而导致的不可用问题 4.消息堆积问题:如…

golang学习-匿名函数和闭包

1、匿名函数 没有函数名的函数&#xff0c;格式如下&#xff1a; func(参数)返回值{ 函数体 } func main() {//将匿名函数保存到变量中sum : func(x, y int) int {return x y}fmt.Println(sum(10, 20)) //通过变量调用匿名函数//自执行函数:匿名函数定义完加()直接执行fu…

了解不同方式导入导出的速度之快

目录 一、用工具导出导入 Navicat&#xff08;速度慢&#xff09; 1.1、导入&#xff1a; 共耗时&#xff1a; 1.2、导出表 共耗时&#xff1a; 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时&#xff1a; 只导出表结构 导入 共耗时&…

保持数据同步:高并发场景下的数据库与缓存一致性维护策略

标题&#xff1a;保持数据同步&#xff1a;高并发场景下的数据库与缓存一致性维护策略 在当今数字化时代&#xff0c;应用程序对实时数据的需求变得越来越高&#xff0c;而在处理大量用户同时访问的情况下&#xff0c;数据库与缓存的一致性成为了一个挑战。无论是电子商务平台…

【前沿技术杂谈:ChatGPT】ChatGPT——热潮背后的反思

【前沿技术杂谈&#xff1a;ChatGPT】ChatGPT——热潮背后的反思 缘起&#xff1a;无中生有&#xff0c;涅槃重生人工智能技术人工智能的发展史无中生有内容自动生成技术的发展代表企业OpenAI-GPT系列技术的发展历程ChatGPT新特点 热潮&#xff1a;万众瞩目&#xff0c;群雄逐鹿…

深入理解STL空间分配器(一)

目录 1.概述 2. STL的几种空间分配器介绍 3. new_allocator 3.1 allocate的实现 3.2 deallocate的实现 3.3 其中几个宏的定义 3.4 _M_max_size的实现 4. malloc_allocator 1.概述 STL的空间分配器&#xff08;allocator&#xff09;定义于命名空间std内&#xff0c;主…

Super关键字

与this关键字用法相同&#xff0c;但super关键字指的是父类的对象 我们常用super.来调用父类对象的属性或者方法 super关键字出来调用父亲的属性还可以调用父亲的方法&#xff0c;方式也是super. super() super()表示调用父类的无参构造 super(参数列表)表示调用父类的有参…

Java中的网络编程

文章目录 网络基础知识IP 地址端口协议 Java 中网络编程InetAddress&#xff08;静态类&#xff09;UDP 通信原理UDP 发送数据步骤UDP 接收数据步骤UDP 发送接收案例 TCP 通信原理TCP 发送数据步骤TCP 接收数据步骤TCP 发送接收案例 网络基础知识 概述&#xff1a;在网络通信协…

认识Linux指令之与时间相关的指令

01.date命令 date 指定格式显示时间&#xff1a; date %Y:%m:%d date 用法&#xff1a;date [OPTION]... [FORMAT] 1.在显示方面 在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加号后接数个标记&#xff0c;其中常用的标记列表如下 %H : …

RT-Thread: 线程创建及应用

说明&#xff1a;这里记录 RT-Thread 的具体创建过程&#xff0c;相当于线程创建的一个模式&#xff0c;具体线程相关的信息没做介绍&#xff0c; RT-Thread 的官方文档里面已经有详细介绍&#xff0c;如有需要请移步官网。 官网链接&#xff1a;https://www.rt-thread.org/do…

【揭秘APT攻击】——内网渗透实战攻略,带你领略网络安全的绝密世界!

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网&#xff1f; 什么是内网渗透&#xff1f; 内网渗透的目的&#xff1a; 内网…

天鹅目标检测数据集VOC格式280张

天鹅&#xff0c;一种优雅而美丽的鸟类&#xff0c;以其洁白的羽毛、优美的身姿和动人的歌声而闻名。 天鹅属于鸟纲、鸭科&#xff0c;是一种大型水禽。它们的羽毛通常是白色、黑色或灰色&#xff0c;非常光滑且富有光泽。天鹅的头部和颈部非常细长&#xff0c;呈现出优雅的曲…

面试题-手撕NMS(非极大值抑制)

非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;是一种常用于目标检测和计算机视觉中的算法&#xff0c;用于去除重叠的边界框&#xff0c;保留最可能是真实目标的边界框。 其核心就是对一组检测框&#xff0c;找出其中属于同一个类别且分数最高…