差分数组入门

差分数组

什么是差分数组?

差分数组:差分数组就是原始数组相邻元素之间的差。

差分数组入门

其实差分数组是一个 辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作。

比如说对于上文的数组,将区间【1,4】的数值全部加上3, 其实当原始数组中元素同时加上或者减掉某个数,那么他们的差分数组其实是不会变化的,如下图所示:

差分数组入门

对区间 [1, 4] 的元素都进行加3操作,差分数组中改变的只是 d[1] 和 d[5],而 d[2] d[3] d[4] 都没变。

把上一步得到的数组当成原数组,再将区间【3,5】的数值全部减去5,结果如下:

差分数组入门

总结:当对一数组的某个区间进行增减某个值时,其差分数组对应的区间左端点的值会同步变化,而他的右端点的后一个值则会相反变化。

参考博文:差分数组

差分数组的作用

差分数组的作用就是 求多次进行区间修改后的数组。构造出差分数组,就可以快速进行区间增减了。花费O(1)的时间修改 diff 数组,就相当于给原数组的整个区间做了修改。

注意 :只能是区间元素同时增加或减少相同的数的情况才能用。

编码实现

通过原数组求出差分数组:

int[] diff = new int[nums.length];
// 根据原数组构造差分数组
diff[0] = nums[0];
for(int i = 1; i < nums.length; ++i) {
    diff[i] = nums[i] - nums[i - 1];
}

通过差分数组得到结果数组:

int[] res = new int[diff.length];
// 通过差分数组得到结果数组
res[0] = diff[0];
for(int i = 1; i < diff.length; ++i) {
    res[i] = res[i - 1] + diff[i];
}
return res;

//-------------其实直接在diff上操作即可得到结果数组----------------
for(int i = 1; i < diff.length; ++i) {
    diff[i] += diff[i - 1];
}
return diff;

给区间 [i, j] 增加 val(可以是负数):

// 直接操作 diff
diff[i] += val;
if(j + 1 < diff.length) {
    diff[j + 1] -= val;
}

例子

lc-1109. &#x822A;&#x73ED;&#x9884;&#x8BA2;&#x7EDF;&#x8BA1;
*  &#x7ED9;&#x4F60;&#x8F93;&#x2F0A;&#x2F00;&#x4E2A;&#x2ED3;&#x5EA6;&#x4E3A; n &#x7684;&#x6570;&#x7EC4; nums&#xFF0C;&#x5176;&#x4E2D;&#x6240;&#x6709;&#x5143;&#x7D20;&#x90FD;&#x662F; 0&#x3002;&#x518D;&#x7ED9;&#x4F60;&#x8F93;&#x2F0A;&#x2F00;&#x4E2A; bookings&#xFF0C;&#x2FA5;&#x2FAF;&#x662F;&#x82E5;&#x2F32;&#x4E09;&#x5143;&#x7EC4;(i,j,k)&#xFF0C;
*  &#x6BCF;&#x4E2A;&#x4E09;&#x5143;&#x7EC4;&#x7684;&#x542B;&#x4E49;&#x5C31;&#x662F;&#x8981;&#x6C42;&#x4F60;&#x7ED9; nums &#x6570;&#x7EC4;&#x7684;&#x95ED;&#x533A;&#x95F4; [i-1,j-1] &#x4E2D;&#x6240;&#x6709;&#x5143;&#x7D20;&#x90FD;&#x52A0;&#x4E0A; k&#x3002;&#x8BF7;&#x4F60;&#x8FD4; &#x56DE;&#x6700;&#x540E;&#x7684; nums &#x6570;&#x7EC4;&#x662F;&#x591A;&#x5C11;&#xFF1F;
&#x8F93;&#x5165;&#xFF1A;bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
&#x8F93;&#x51FA;&#xFF1A;[10,55,45,25,25]

这个例子初始的原数组全为0,表示 n 个航班初始预定的座位数都为0。对原数组的某些区间有多次加操作,过程如下:

`txt
0 0 0 0 0
10 10
20 20
25 25 25 25

Original: https://www.cnblogs.com/afei688/p/16598099.html
Author: 阿飞的客栈
Title: 差分数组入门

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616684/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • DECODE函数的奇怪用法的例子

    背景:你们公司超级注重企业文化,要求大家要做好孩子多读书,公司老板叫王富贵,老板娘叫张翠花,另有员工若干人。 需求:领导要求搞一个员工读书记录排名,展示出每个员工所读过的书都有啥?…

    Java 2023年6月8日
    086
  • 树的基本概念介绍

    为什么需要树这种数据结构 这是我本人在B站看韩顺平老师数据结构和算法的学习笔记,记录一下,防止忘记 1) 数组存储方式的分析 优点:通过 下标方式访问元素,速度快。对于有序数组,还…

    Java 2023年6月15日
    073
  • Java学习 (16) Java方法篇(03)递归

    递归 语法实例 递归与循环的区别 递归优缺点 循环优缺点 递归 递归就是就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原…

    Java 2023年6月8日
    087
  • MySQL 常见面试题/知识点总结!(2021 最新版)| JavaGuide

    相关阅读: 2.7w字!Java基础面试题/知识点总结!(2021 最新版) 这篇文章之前发过,不过,我最近对其进行了重构完善并且修复了很多小问题。所以,在公号再同步一下! 内容很…

    Java 2023年6月9日
    086
  • 聊聊 SpringBoot 中的两种占位符:@*@ 和 ${*}

    在 SpringBoot 项目中,我们经常会使用两种占位符(有时候还会混用),它们分别是: @*@ ${*} 如果我们上网搜索「SpringBoot 的占位符 @」,大部分答案会告…

    Java 2023年6月16日
    083
  • Java项目实战——瑞吉外卖Day06

    导入用户地址簿相关功能代码 需求分析 地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。同一个用户可以有多个地址信息,但是只能有一个 默认地址。 数据…

    Java 2023年5月29日
    069
  • SpringBoot启动流程原理解析(二)

    在上一章我们分析了SpingBoot启动流程中实例化SpingApplication的过程。 return new SpringApplication(primarySources…

    Java 2023年6月5日
    070
  • JAVA基本数据类型

    整型、浮点型、布尔型、字符型 整型:byte、short、int、long浮点型:float、double布尔型:boolean字符型:char Original: https:/…

    Java 2023年6月8日
    093
  • CTFHub_2017-赛客夏令营-Web-Fast Running(条件竞争、多线程)

    进入场景,显示如下 本题考察条件竞争,需要你改完密码后登录要比系统自动更改密码快 python脚本如下,需要同时开2个线程 __author__ = Serena import t…

    Java 2023年5月29日
    049
  • 合并PDF

    itext依赖 com.itextpdf itextpdf 5.5.9 com.itextpdf itext-asian 5.2.0 import com.itextpdf.tex…

    Java 2023年6月8日
    085
  • java日常开发必备:list的四种遍历

    在平时的开发过程中使用List的场景很多,你知道List的遍历有多少种方式?今天一起来梳理下List的几种遍历方式。这里以java.util.ArrayList为例来演示。 这里有…

    Java 2023年6月9日
    081
  • 程序员你如何检查参数的合法性?

    作为程序员的你,代码中最多的就是各种方法了,你是如何对参数进行校验的呢? 背景 大部分的方法和构造函数对传入的参数值有一些限制,比如:常见的索引值必须是非负数,对象引用不能为空。 …

    Java 2023年6月8日
    080
  • 线程池

    线程池 概论 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 线程池的好处 降低资源的消耗 提高响应速度 方便管理 总结:线程复用,可以…

    Java 2023年6月5日
    062
  • Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自or…

    Java 2023年5月30日
    061
  • spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象。 后来发现完全多此一举,可…

    Java 2023年6月7日
    075
  • 教学日志:javaSE-面向对象2

    一、局部变量和成员变量 package class4.oop1; /** * @Auther: Yu Panpan * @Date: 2021/12/10 – 12 – 10 – …

    Java 2023年6月5日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球