差分思想解决区间压缩问题

差分思想是一种处理数组的方法,通过对数组各元素与前一元素做差,得到新的差分数组,用于快速还原原数据。文章讨论了在处理区间数据更新和航班预订统计等场景中如何运用差分算法,如1109. 航班预订统计问题,通过差分可以高效计算每个航班的座位占用情况。同时,5505. 所有排列中的最大和问题也展示了差分在求解最大和排列时的作用,通过正负差分确定每个元素出现次数,然后累乘得到最大和。
摘要由CSDN通过智能技术生成

定义

差分对于一个数组中的数据来说,他就是让数组的每一项分别与前一项做差,得到一个每一项与前一项的关系
在这里插入图片描述
对最后的差分数组而言,他的第一项和原本数据的第一项相同,相当于arr[0] - 0;而与原数组相比,又多了一项,相当于0 - arr[n-1]

所以说,根据差分数组,可以从第二项开始,从前向后逆推出原本的数据;arr[i] = arr[i] + arr[i−1]
在这里插入图片描述

应用场景

给出n长度的数组,再给出m个相交的区间,让对这些区间中的数据进行+1操作
在这里插入图片描述
再告诉数据范围是1 <= n <= 105,也就是说想要在1s中得到结果,那么时间复杂度就得是O( n )

解决方法 时间复杂度
暴力 O(n^2)
线段树或者树状数组 O(mlogn)
差分 O(n)

1109. 航班预订统计

https://leetcode-cn.com/problems/corporate-flight-bookings/

在这里插入图片描述
对于座位来说,[2,5,25] 表示在2号航班,3号航班,4号航班,5号航班都预定25个座位,到6号航班(假设)的时候就没有这25个座位了。

bookings[i] = [i, j, k] 表示在 i 站增加 k 人ans[i-1] += k;在 j+1 站减少 k 人,即 ans[j] -= k(因为需要返回的结果中,0号下标代表1站)

每站总人数: 前一站人数加上当前人数变化ans[i] += ans[i - 1]
在这里插入图片描述

程序实现
对于最后一站的航班,就不需要再额外计算了,因为之后的座位数就是0

class Solution {
   
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings,<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值