labuladong刷题之前缀和与差分数组技巧(空间换时间)

article/2025/6/24 14:08:20

Q1题目链接:https://leetcode.com/problems/range-sum-query-immutable/

leetcode 303

看到题目的第一思路:

代码随想录之后的想法和总结:

如何用 prefix 查询区间和?

如果你想查询:nums[left] + nums[left+1] + ... + nums[right]

可以用公式:

sumRange(left, right) = prefix[right + 1] - prefix[left]

唯一要注意的是 要在前缀和数组前面加一个索引,也就是比数组多一个索引

时间复杂度以及空间复杂度:

🧮 初始化阶段:__init__(self, nums: List[int])

时间复杂度:O(n)

  • n 是输入数组 nums 的长度。

  • 因为你只循环了一遍数组,计算前缀和,所以是 线性时间

空间复杂度:O(n)

  • self.preSum 数组的长度是 n + 1,所以占用了额外的线性空间。


🔍 查询阶段:sumRange(left, right)

时间复杂度:O(1)

  • 你只做了一次减法:preSum[right+1] - preSum[left]

  • 所以无论查询区间多大,时间始终是常数级。

空间复杂度:O(1)

  • 不需要分配额外空间,仅使用已有数组

“这种方式用空间换时间,通过一次性预处理前缀和,使查询操作从 O(n) 降到 O(1),适用于大量查询的场景。”


Q2题目链接:https://leetcode.com/problems/range-sum-query-2d-immutable/

leetcode 304

看到题目的第一思路:

好难 之后再回来看一下这题

代码随想录之后的想法和总结:

最主要是这个方法的应用

时间复杂度以及空间复杂度:

Q3题目链接:https://leetcode.com/problems/corporate-flight-bookings/

leetcode 1109 航班预订问题

看到题目的第一思路:

可以把这个题目变相理解为差分数组的问题:给你输入一个长度为 n 的数组 nums,其中所有元素都是 0。再给你输入一个 bookings,里面是若干三元组 (i, j, k),每个三元组的含义就是要求你给 nums 数组的闭区间 [i-1,j-1] 中所有元素都加上 k。请你返回最后的 nums 数组是多少?

代码随想录之后的想法和总结:

差分数组的原理:

  • diff[i] += 3 :表示从下标 i 开始的所有元素都要加 3。

  • diff[j+1] -= 3 :表示从下标 j+1 开始的元素都要恢复原来的值(即把之前加的 3 抵消)。

于是,这就实现了只在区间 [i..j] 加了 3,外面的不变。

把题目变相理解为差分数组其实就三个步骤

1 初始化一个原始数组 元素都为0,并且把题目要求的区间也初始化元素

2 构造差分数组,并且使用差分法对他进行区间加法

比如 初始化diff数组,给diff数组的中间元素[i,j]之间加上val

3 通过前缀和从差分数组diff还原出结果数组

方法/步骤作用
__init__(nums)初始化差分数组 diff,支持后续快速区间加法
increment(i, j, v)把原数组中区间 [i..j] 每个元素加上 v,只修改差分数组
result()

通过前缀和,从差分数组 diff 还原出最终的数组

时间复杂度以及空间复杂度:

时间:O(n) 初始化数组,构造差分数组,遍历元素,还原数组 都是O(n)

空间复杂度分析

1. 差分数组 self.diff 大小为 n

2. 返回的结果数组 res 也是 n


Q4题目链接:1094. Car Pooling

leetcode 1094 乘客上车问题

看到题目的第一思路:

可以转换成差分数组思路:把所有乘客的上车区间 [i, j](即从 i 公里开始,到 j 公里之前结束)都叠加起来,得到每一公里车上实际有多少人,然后判断是否有超过车的容量的情况

代码随想录之后的想法和总结:

相信你已经能够联想到差分数组技巧了:trips[i] 代表着一组区间操作,旅客的上车和下车就相当于数组的区间加减;只要结果数组中的元素都小于 capacity,就说明可以不超载运输所有旅客

注意:

使用 j = trip[2] - 1 是因为:我们要计算每个站点车上的乘客,[i,j,val]也就分别表示乘客从i上车到j是还在车上的最后一站,这些时刻车上增加了多少乘客,如果trip[2]是区间这时乘客已经下车了,不能加到区间里面了

  • 我们用的是 闭区间 [i, j] 的差分数组逻辑

  • 而题目给的上下车区间语义是 左闭右开 [from, to)

  • 所以要转换成闭区间,就变成了 [from, to - 1]

时间复杂度以及空间复杂度:

✅ 综合时间复杂度:

  • 差分数组初始化:O(1)

  • 遍历 trips:O(n)

  • 还原数组:O(1)

  • 检查是否超载:O(1)

总时间复杂度:O(n),其中 ntrips 的长度。


🧠 空间复杂度分析

  • nums 数组固定长度为 1001 → O(1)

  • diff 数组长度为 1001 → O(1)

  • res 数组长度为 1001 → O(1)

你没有使用与 n 相关的额外空间,所有数组长度固定(最多 1001)。

总空间复杂度:O(1)(常数空间)

今日收获,学习时长:

重点学习了两个数组中的技巧:

前缀和技巧:原始数组不会被修改的情况下,频繁查询某个区间的累加和

差分数组技巧:频繁对原始数组的某个区间元素进行增减

前缀和技巧有几个局限性:

第一个局限性:使用前缀和技巧的前提是原数组 nums 不会发生变化

如果原数组中的某个元素改变了,那么 preSum 数组中该元素后面的值就会失效,需要重新花费 O(n)O(n) 的时间计算 preSum 数组,这就和普通的暴力解法没太大区别了。

第二个局限性:前缀和技巧只适用于存在逆运算的场景

比方说求和的场景,你知道 x+6=10x+6=10,那么可以推导出 x=10−6=4x=10−6=4,求乘积的场景也是类似的,你知道 x∗6=12x∗6=12,那么可以推导出 x=12/6=2x=12/6=2,这就叫存在逆运算,都可以使用前缀和技巧。

但有些场景是没有逆运算的,比方说求最大值的场景,你知道 max(x,8)=8max(x,8)=8,此时你无法推导出 xx 的值。

差分数组的优缺点:

优势说明
🟢 区间修改效率高原本要对一个区间的所有元素做修改,差分数组只需修改两个端点,时间复杂度从 O(n) → O(1)。
🟢 代码实现简单、空间利用率高只需维护一个额外的数组(差分数组),不需要复杂的数据结构。
🟢 不破坏原数组结构原始数组通过差分数组+前缀和可以随时还原。

注意点说明
✅ 差分数组适合只做区间加减修改,不适合频繁查询单个值时使用(除非先恢复)。
✅ 差分数组不适合动态修改(如删除某一段修改),要使用更复杂的数据结构(如树状数组、线段树)。
✅ 最终结果数组要通过 前缀和还原 才能得出正确值。

http://www.hkcw.cn/article/aobZdPieGA.shtml

相关文章

基于爬取的典籍数据重新设计前端界面

1.BooksView(书籍列表页) 2.ClassicsView(目录页) 3.管理员端

Origin将杂乱的分组散点图升级为美观的带颜色映射的气泡图

图形初步了解 带颜色映射的气泡图,是一种含有三个变量的高级散点图,前两个变量分别为横纵坐标,第三个变量通过气泡的大小和颜色来呈现。在视觉上辅助读者直观地比较三个变量的关系。 在本例图中,通过pH、Group和Solubility三个指…

初识Linux指令(笔记2)

(1)man指令(重要) Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man 语法: man [选项] 命令 (2)cp指令(重要&…

w374预报名管理系统设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

JAVA-springboot整合Mybatis

SpringBoot从入门到精通-第15章 MyBatis框架 学习MyBatis心路历程 2022年学习java基础时候,想着怎么使用java代码操作数据库,咨询了项目上开发W同事,没有引用框架,操作数据库很麻烦,就帮我写好多行代码,就…

Torch Geometric GCN训练心得

我训练的是直推式的图卷积神经网络GCN 对于直推式GCN训练,控制参数量是非常重要的,我的网络大小30个节点: 不像归纳式学习训练,可以通过提升样本数量来承受巨大的模型参数量,直推式学习一次训练的目标就一个样本&…

张雪峰宣布暂停直播两个月 深情感言引共鸣

张雪峰宣布暂停直播两个月 深情感言引共鸣。5月31日晚,有网友发布视频称张雪峰结束了2025届高考季的直播,并宣布将暂停直播两个月。在直播中,张雪峰表示这个行业不容易,因为他触动了太多人的利益,有些事情不能说得太直白。他希望能在8月1日恢复直播,如果不行的话,9月1日…

线程池详细解析(一)

java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理的使用线程池能够带来三个好处。 1. 降低资源消耗:频繁的创建线程和销毁线程会产生不少的资源上的消耗,通过重…

韩国大选今日开始投票 五候选人竞逐总统

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。未参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下五位候选人中…

米奇盖顿:音乐架起中美交流桥梁 纯粹情感共鸣

米奇盖顿在湖南卫视《歌手2025》的舞台上演唱完《If I Were a Boy》后,不禁潸然泪下。这位来自美国得克萨斯州的乡村音乐女歌手,曾在2021年获得格莱美最佳乡村独唱表演提名,成为首位提名该奖项的黑人女歌手。在中国观众毫无保留的情感反馈中,她感受到了一种久违的真诚。在美…

字节跳动社招面经 —— BSP驱动工程师(6)

接前一篇文章:字节跳动社招面经 —— BSP驱动工程师(5) 本文内容参考: 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢! 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…

检索器组件深入学习与使用技巧 VectorStoreRetriever 检索器

1. VectorStoreRetriever 检索器 VectorStoreRetriever 是 BaseRetriever 的子类,这是一个专门针对向量数据库的基础检索器,在 VectorStoreRetriever 的内部实现了 _get_relevant_documents() 方法,还定义了单独的属性: vectors…

深度学习pycharm debug

深度学习中,Debug 是定位并解决代码逻辑错误(如张量维度不匹配)、训练异常(如 Loss 波动)、数据问题(如标签错误)的关键手段,通过打印维度、可视化梯度等方法确保模型正常运行、优化…

女研究生二次入伍再续海军梦 逐梦军营续写辉煌

女研究生二次入伍再续海军梦!在2025年春季入伍的新兵中,有一名特殊的“老兵”。她曾在海军某部服役两年,退伍后重返校园继续学业。如今已是研究生的她再次穿上海军军装,来到南部战区海军某训练基地,又一次成为了海军战士,踏上了二次入伍的军旅生涯。张玉玺于2020年9月第一…

尾号7个0的手机号拍出61.2万元 独特号码高价成交

一个尾号为七个零的手机号码使用权于6月1日以25万元底价起拍,共有13人参与竞拍。最终该号码以61.2万元成交。公告显示,截至4月23日,该号码无欠费,余额约9.14元,已办理4G全国流量王8元套餐,未绑定宽带,过户无预存话费要求,完成过户即可转网。目前,该号码使用权已被天津…

中国单方面免签“朋友圈”扩大 拉美五国加入免签行列

中国单方面免签“朋友圈”扩大 拉美五国加入免签行列。从6月1日起,巴西、阿根廷、智利、秘鲁、乌拉圭五个国家的持普通护照人员可以享受免签政策。这一政策试行期为2025年6月1日至2026年5月31日,期间这些国家的公民来华经商、旅游观光、探亲访友、交流访问或过境不超过30天,…

贝尔伯克当选联大主席 大V解读 女性力量再添一笔

6月2日,德国前外长贝尔博克当选为第80届联合国大会主席,成为第五位担任此职位的女性。联合国大会以167票赞成通过了安娜莱娜贝尔博克出任下一任主席的决定。贝尔博克对此表示非常感激,并承诺将通过“基于信任的对话”为大家服务。她宣称自己的目标是减少冗余、提高透明度,并…

上海游客“表扬帖”走红网络 感谢信点赞厦门辅警

上海游客“表扬帖”走红网络 感谢信点赞厦门辅警!一篇饱含深情的表扬贴在小红书上迅速走红,网友查女士诚挚地感谢了一位帮助她的厦门辅警。厦门双子塔上灯光轮滚播放着连续七届获选文明城市的信息,这是每一位厦门人共同努力、团结一致的结果。5月25日中午11点多,上海游客查…

如何评估 RAG 的分块Chunking策略

如何评估 RAG 的分块策略 我对 RAG(检索增强生成模型)进行了深入研究,深知分块在任何 RAG 流水线中都至关重要。 我接触过的许多人坚信更好的模型能够提升 RAG 的性能。有些人则对向量数据库寄予厚望。即便那些认同分块重要性的人&#xff…

贪心算法应用:顶点覆盖问题详解

贪心算法应用:顶点覆盖问题详解 贪心算法是解决顶点覆盖问题的经典方法之一。下面我将从基础概念到高级优化,全面详细地讲解顶点覆盖问题及其贪心算法解决方案。 一、顶点覆盖问题基础 1. 问题定义 顶点覆盖问题(Vertex Cover Problem&am…