盖子的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,一经查实,立即删除!

相关文章

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

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

从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.消息堆积问题:如…

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

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

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

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

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

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

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

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

烟雾识别摄像机

烟雾识别摄像机是一种具有智能识别功能的监控设备&#xff0c;它能够通过图像识别技术检测和识别烟雾&#xff0c;提供实时监测和报警功能。这种摄像机通常应用于各种场所&#xff0c;如工厂、仓库、办公楼、酒店等&#xff0c;起到了重要的安全监测作用。 烟雾识别摄像机的工作…

新手练习项目 4:简易2048游戏的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

光伏方案设计有什么注意点?

光伏方案设计是实现光伏发电系统高效运行的关键环节。在进行光伏方案设计时&#xff0c;有几个重要的注意点需要特别关注。 首先&#xff0c;要充分考虑地理位置和气候条件。不同地区的日照时数、太阳辐射强度和日照角度都有所不同&#xff0c;这些因素直接影响光伏发电系统的发…

FS【1】:SSP

文章目录 前言1. Abstract2. Introduction2.1. Motivation2.1.1. Few-shot Segmentation (FSS) Task2.1.2. Few-shot Segmentation (FSS) Problem 2.2. Contribution 3. Methods3.1. Motivation3.2. Overview of the architecture4.3. Self-support Prototype4.4. Adaptive Sel…

C++:多态究竟是什么?为何能成为面向对象的重要手段之一?

C&#xff1a;多态究竟是什么&#xff1f;为何能成为面向对象的重要手段之一&#xff1f; 前言一、多态的概念二、多态的定义及实现2.1 多态的构成条件2. 2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的例外1&#xff1a;协变(基类与派生类虚函数返回值类型不同)2.3.2 虚函数重写…

领域驱动模型之各层实体严格分层处理

为什么要分层处理呢&#xff1f; 在领域驱动模型中&#xff0c;分为应用层&#xff08;application&#xff09;、领域层&#xff08;domain&#xff09;、基础设施层&#xff08;infrastructure&#xff09;。各层只能处理和访问自己所属层的 entity 或者 dto 对象&#xff0…

基于ssm的理财通的设计与实现+jsp论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对理财信息管理的提升&#xff0c…

针对大规模服务日志敏感信息的长效治理实践

文章目录 1 背景2 目标与措施3 实施3.1 脱敏工具类3.2 JSON脱敏3.3 APT自动脱敏3.3.1 本地缓存问题3.3.2 JDK序列化问题 3.4 弃用方案 4 规划5 总结 1 背景 近年来&#xff0c;国家采取了多项重要举措来加强个人数据保护&#xff0c;包括实施《中华人民共和国网络安全法》和《…