码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 学习笔记之算法:差分数组


    学习博客:差分数组详解_zsyz_ZZY的博客-CSDN博客_差分数组

    用途:

    给定一个源数组a,后续会对a数组其中区间进行+-操作,最后会需要计算和和期间某一个下标对应字符变化的时候可用。

    如:

    有源数组a。

    还有动作数组b。

    b中某一组会对a的 [ L, R ] 进行 +x 操作,也就是说从a[ L] 到a[ R]位置的所有源数组内容都需要+x。且这样的 b操作有多个。

    这时候我们暴力循环肯定是性能很差会超时。因此需要使用差分数组。

    思路:

    下面我们设定四个数组:before[ i ],  diff[ i ],  after[ i ],sum[ i ];

    before:表示原数组,

    diff:是差分数组,

    after:是修改后的数组,

    sum:是前缀和数组。

    当 i = 0 的时候:before[ 0 ] = diff [ 0 ]  = after [ 0 ]  = sum [ 0 ]

    diff [ i ]    = before[ i ] - before[ i-1];   

    after [ i ] = after [ i - 1 ] + diff [ i ];即 diff 数组的前缀和。

    sum [ i ] = sum[ i - 1 ] + after [ i ];即 after 数组的前缀和。

    由此我们可以得到下列公式:

    下面为了标中书写看上去舒服,将原数组before 简称 b。

    idiff (简称:d)after (简称:a)sum(简称 s)
    0= b [ 0 ]

    = d [ 0 ]

    = b [ 0 ]

    = a [ 0 ]

    = d [ 0 ]

    = b [ 0 ]

    1= b [ 1 ] - b [ 0 ]

    = a [ 0 ] + d [ 1 ]

    = b [ 0 ] +  b [ 1 ] - b [ 0 ]

    = b [ 1 ]

    = s [ 0 ] + a [ 1 ]

    = b [ 0 ] + b [ 1 ]

    2= b [ 2 ] - b [ 1 ]

    = a [ 1 ] + d [ 2 ]

    = b [ 1 ] +  b [ 2 ] - b [ 1 ]

    = b [ 2 ]

    = s [ 1 ] + a [ 2 ]

    = b [ 0 ] + b [ 1 ] + b [ 2 ]

    3= b [ 3 ] - b [ 2 ]

    = a [ 2 ] + d [ 3 ]

    = b [ 2 ] +  b [ 3 ] - b [ 2 ]

    = b [ 3 ]

    = s [ 2 ] + a [ 3 ]

    = b [ 0 ] + b [ 1 ] + b [ 2 ] + b [ 3 ]

    当我们需要从下标 0 加上x, 下标 2 减去 y,可得到以下效果。

    下面为了标中书写看上去舒服,将原数组before 简称 b。

    idiff (简称:d)after (简称:a)sum(简称 s)
    0= b [ 0 ] + x

    = d [ 0 ]

    = b [ 0 ] + x

    = a [ 0 ]

    = d [ 0 ]

    = b [ 0 ] + x

    1= b [ 1 ] - b [ 0 ]

    = a [ 0 ] + d [ 1 ]

    = b [ 0 ] + x +  b [ 1 ] - b [ 0 ]

    = b [ 1 ] + x

    = s [ 0 ] + a [ 1 ]

    = b [ 0 ] + x + b [ 1 ] + x

    = b [ 0 ] + b [ 1 ] + 2 * x

    2= b [ 2 ] - b [ 1 ] - y

    = a [ 1 ] + d [ 2 ]

    = b [ 1 ] + x +  b [ 2 ] - b [ 1 ] - y

    = b [ 2 ] + x  - y

    = s [ 1 ] + a [ 2 ]

    = b [ 0 ] + b [ 1 ] + 2 * x + b [ 2 ] + x - y

    = b [ 0 ] + b [ 1 ] + b [ 2 ] + 3 * x - y

    3= b [ 3 ] - b [ 2 ]

    = a [ 2 ] + d [ 3 ]

    = b [ 2 ] + x  - y + b [ 3 ] - b [ 2 ]

    = b [ 3 ] + x  - y

    = s [ 2 ] + a [ 3 ]

    = b [ 0 ] + b [ 1 ] + b [ 2 ] + 3 * x - y + 

       b [ 3 ] + x  - y

    = b [ 0 ] + b [ 1 ] + b [ 2 ] + b [ 3 ] + 4 * x - 2 * y

    由此,当我们需要求[ l, r ] 之间的数据 + x的时候,我们只需要 diff [ l ] + x, diff [ r ] - x,就可以达到效果了。

  • 相关阅读:
    【红绿灯识别】红绿灯识别【含GUI Matlab源码 1908期】
    62. 解释一下MySQL中内连接,外连接等的区别(MySQL面试第五弹)
    云原生场景下高可用架构的最佳实践
    高级 Kubernetes 部署策略
    超级实用的程序员接单平台,看完少走几年弯路,强推第一个!
    支持存档的书签服务LinkWarden
    内存屏障(Memory Barrier)
    使用SpringBoot发送异步事件的方式解决前端接口调用超时问题
    JAVA总结作业----集合
    【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-最长的元音字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 原文地址:https://blog.csdn.net/lingjinyue/article/details/124575263
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号