算法笔记——差分数组

差分数组是一种优化区间修改操作的数据结构,通过保存数组相邻元素的差值,可以高效地处理大规模的区间加减操作。在LeetCode1109题目中,差分数组被用来解决航班预订系统的座位预订问题,通过修改差分数组的特定元素快速完成区间更新,最后通过前缀和计算得到原数组。这种技术避免了遍历整个数组,提高了算法效率。
摘要由CSDN通过智能技术生成

差分数组

概念

所谓差分数组就是对数组的相邻元素求差保存到一个新的数组中,这个数组就是差分数组。
如下所示:

序号01234
原数组a15343
差分数组d14-21-1

作用

用于频繁的区间修改
区间修改是对数组的一段区间同时加上或减去某一个数
对上面的数组我们执行如下操作:
1.对区间[0,3]中的每个元素加3
2.对区间[1,2]中的每个元素减2
我们不难想到可以通过遍历区间中的每个元素来实现,但是如果区间很大,执行的操作很多时,这种方法很容易超时。这时就需要用到差分数组。

我们观察当我们对区间[0,3]中的每个元素进行加3操作时,差分数组只有d[0]和d[4]会发生变化。

序号01234
原数组a48673
差分数组d44-21-4

同理,对区间[1,2]执行减2操作时,只有d[1]和d[3]会发生变化。

序号01234
原数组a46473
差分数组d42-23-4

这就是差分数组所有的性质:当对区间[i,j]进行加减操作时,差分数组d[i]进行相同的操作,d[j+1]进行相反的操作。
利用差分数组的这个性质,我们对数组任意长度的区间修改不再需要遍历每个元素而只需要修改差分数组两个元素的值即可。
当进行完所有的区间操作后,对差分数组求一个前缀和即可得到原数组。
因为d[i]=a[i]-a[i-1],所以a[i]=a[i-1]+d[i],并且有a[0]=d[0],我们可以从前往后依次求出a[i]。

例题

LeetCode1109

参考代码

class Solution
{
public:
    vector<int> corpFlightBookings(vector<vector<int>> &bookings, int n)
    {
        vector<int> d(n, 0);
        for (int i = 0; i < bookings.size(); i++)
        {
            int fir = bookings[i][0] - 1;
            int last = bookings[i][1] - 1;
            int seats = bookings[i][2];
            d[fir] += seats;
            if(last+1<n)
                d[last + 1] -= seats;
        }
        for (int i = 1; i < n; i++)
        {
            d[i] += d[i - 1];
        }
        return d;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值