BUGAWAY算法小抄-差分数组

news/2025/1/6 18:19:10/文章来源:https://www.cnblogs.com/bugaway/p/18651920

BUGAWAY算法小抄-差分数组

什么是差分数组?

差分数组的思想是通过对原始数组进行处理,得到一个新的数组(差分数组),利用该数组来高效地进行区间更新操作。具体来说,差分数组记录的是相邻元素之间的差值,而不是原始数组的元素本身。

差分数组的原理

1. 差分数组的构造:

假设有一个数组 A = [a1, a2, a3, ..., an],我们可以构造一个差分数组 D,使得 D[i] = A[i] - A[i-1]D[0] = A[0])。

这样,D 记录了 A 中相邻元素的差值。

2. 区间更新:

在差分数组中,给定一个区间 [l, r]想要将该区间内的所有元素加上某个值 v,只需要做以下两步操作:

  • D[l] += v,表示从位置 l 开始所有元素都增加 v
  • D[r+1] -= v,表示从位置 r+1 开始所有元素都不再增加 v

最后,通过差分数组计算得到原始数组的最终值。

3. 恢复原始数组:

利用差分数组 D 可以恢复原始数组 A,通过累加差分数组的元素得到原数组的值:

  • A[0] = D[0]
  • A[i] = D[i] + D[i-1] + ... + D[0] (即累加差分数组的值)

差分数组的算法应用

差分数组主要用于高效地处理区间更新操作,通常出现在以下几类问题中:

1. 区间加法操作

如果需要对数组的一个区间 [l, r] 进行加法更新,传统的方法可能需要遍历区间内的每个元素,时间复杂度是 O(r - l + 1),但通过差分数组可以将区间更新的时间复杂度降为 O(1)。这使得对于大量的区间更新操作,算法效率大大提高。

示例

  • 给定一个数组 arr 和多个区间 [l, r, v],对于每个区间,将 arr[l]arr[r] 之间的所有元素加上 v。使用差分数组处理,可以将时间复杂度从 O(k * n)k 个区间,n 为数组大小)降低到 O(k + n)

2. 区间查询问题

如果题目需要在处理区间更新的同时进行区间查询,差分数组也可以与前缀和结合,帮助实现高效的查询和更新。

  • 差分数组用于快速实现区间加法更新。

  • 前缀和则用于在差分数组上进行恢复,快速查询指定区间的和。

示例

  • 对数组进行区间更新后,要求查询某个位置的元素值。差分数组通过前缀和可以在 O(1) 时间内恢复出数组元素。

3. 区间求和与区间赋值操作

在一些变种问题中,差分数组的思想可以用来进行区间求和或其他区间相关的操作,减少时间复杂度。


🥱闲话少说,直接上例题!

实践

731. 我的日程安排表 II

class MyCalendarTwo {// 由于时间范围比较大,可以考虑用TreeMap实现TreeMap<Integer, Integer> cnt;public MyCalendarTwo() {cnt = new TreeMap<Integer, Integer>();}public boolean book(int start, int end) {// 预定[start,end]的时段,说明该时段每个时点的预定数都需要+1——符合差分数组“区间更新”的思想。int ans = 0;int maxBook = 0;cnt.put(start, cnt.getOrDefault(start, 0) + 1);cnt.put(end, cnt.getOrDefault(end, 0) - 1);for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {int freq = entry.getValue();maxBook += freq;ans = Math.max(ans, maxBook);if (maxBook > 2) {// 复原操作cnt.put(start, cnt.getOrDefault(start, 0) - 1);cnt.put(end, cnt.getOrDefault(end, 0) + 1);return false;}}return true;}
}/*** Your MyCalendarTwo object will be instantiated and called as such:* MyCalendarTwo obj = new MyCalendarTwo();* boolean param_1 = obj.book(startTime,endTime);*/

732. 我的日程安排表 III

class MyCalendarThree {TreeMap<Integer, Integer> cnt;public MyCalendarThree() {cnt = new TreeMap<Integer, Integer>();}public int book(int start, int end) {int maxBook = 0;int ans = 1;cnt.put(start, cnt.getOrDefault(start, 0) + 1);cnt.put(end, cnt.getOrDefault(end, 0) - 1);for(Map.Entry<Integer, Integer> entry: cnt.entrySet()){int freq = entry.getValue();maxBook += freq;ans = Math.max(ans, maxBook);}return ans;}
}/*** Your MyCalendarThree object will be instantiated and called as such:* MyCalendarThree obj = new MyCalendarThree();* int param_1 = obj.book(startTime,endTime);*/

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

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

相关文章

emby美化后续折腾

GitHub - Nolovenodie/emby-crx: Emby 增强/美化 插件 (适用于 Chrome 内核浏览器 / EmbyServer)emby美化尝试皮蛋熊 2023-10-18/1 评论/2 点赞/6151 阅读/8117 字10/18温馨提示: 本文最后更新于 2023-10-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到…

特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值

title: 特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值 date: 2025/1/4 updated: 2025/1/4 author: cmdragon excerpt: 随着数据管理需求的多样化,许多现代数据库系统开始支持特殊数据类型,以满足更多复杂应用场景的需求。在 PostgreSQL 中,JSON、数组和 HSTORE…

[.NET] Aspire 9 新特性及优化

随着 .NET 9 的发布,.NET Aspire 迎来了一系列重大更新和改进。这些更新不仅让 Aspire 变得更加成熟,也使其终于具备了投入生产环境的条件。本文将详细介绍 Aspire 的最新特性和改进。🚀Aspire 9 新特性及优化 摘要 随着 .NET 9 的发布,.NET Aspire 迎来了一系列重大更新和…

MapReduce--国家气候数据中心

NCDC:https://www.ncei.noaa.gov/中国气象数据网:https://data.cma.cn/

ABB IRB6640机械手减速机维修步骤

ABB IRB6640机械手减速机维修涉及多个步骤和注意事项,以下是一些关键的abb机械臂维修步骤和建议:一、故障排查检查故障代码:首先,通过查看机械手的故障显示屏或控制柜的显示屏,记录显示的错误代码。这些代码通常能指示减速机或其他部件的故障类型。检查电源和电缆:确保机…

Pycharm 2024.3.1.1 安装激活详细图文教程(激活至2026,实际上永久,亲测!)以及常见问题处理

申明:本教程 Pycharm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 Pycharm 首先,如果小伙伴的电脑上有安装老版本的 Pycharm , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即…

java8--类Scanner--文件内容输入--错误的使用方法

Scanner in = new Scanner("mygile.txt"); String str = in.nextLine(); System.out.println(str);效果图:ps: 1.没有用类Paths的静态方法get指定路径,直接在创建Scanner新对象时传入文件名做参数,使用时不会启动输入步骤,不会从键盘获取输入,执行的是赋值操作…

Webstorm 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:Webstorm 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 Webstorm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! Webstorm是JetBrains公司推出的一款功能强大的JS集成…

24. 两两交换链表中的节点(中)

目录题目法一、迭代法二、递归 题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。法一、迭代 var swapPairs = function(head) {let dummy = {next:head}let p1 = dummywhile(p1.ne…

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)PDF、EPUB免费下载

周志明JVM新作,新增内容近50%,大厂面试知识点全覆盖。与《Java编程思想、EffectiveJava、Java核心技术》堪称“Java四大名著”适读人群 :1.使用Java技术体系的中-高级开发人员 2.系统调优师 3.平台架构师 4.准备进互联网大厂面试的Java开发人员 周志明JVM新作,新增内容近50…

使用 ActiViz.Net (商业版)实现读三维地震数据可视化

一、背景 在地震勘探中,SEG-Y 格式(简称 SEGY)是最常用的数据格式之一,用于存储地震波的原始数据。地震数据通常包含了时间序列信息,并通过不同的采样和测量方法来记录地下结构的属性。为了有效地可视化这些数据,尤其是地震波的幅度和传播情况,三维可视化是一个非常有用…

使用 ActiViz.Net 实现读三维地震数据可视化

一、背景 在地震勘探中,SEG-Y 格式(简称 SEGY)是最常用的数据格式之一,用于存储地震波的原始数据。地震数据通常包含了时间序列信息,并通过不同的采样和测量方法来记录地下结构的属性。为了有效地可视化这些数据,尤其是地震波的幅度和传播情况,三维可视化是一个非常有用…