差分数组技巧 [labuladong-刷题打卡 day4]

发布时间 2023-08-04 11:16:09作者: Alan-Blog

继前缀和之后,差分数组算法随之而出!

所谓差分,即采用和前序数的差标记此数,最后对前序差分使用前缀和,就可以得到真值。
由于都采用差分表述,那么改变前序的一个值,势必会对后续整体造成影响,But!
如果输入本就是要求对连续数进行操作,那么就可以把这种‘劣势’转为优势啦!
最后只需要在待操作连续子数组后一个书,添加一个反向差值,那么就可以消除对后续数组的影响
例题:
1109. 航班预订统计

class Solution {
public:

    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> diff(n);//差分数组
        for(auto& booking :bookings){//auto关键字 使用迭代器对vector便利,由于是数组,所以需要&
            diff[booking[0]-1]+=booking[2]; 
            if(booking[1]<n) //判断操作子数组末尾是否超过整体数组,操作则不需要对后续数组消除影响
                diff[booking[1]]-=booking[2];//消除第i+1个开始的后续数组影响
        }
        for(int i=1;i<n;i++){//前缀和计算真值
            diff[i]+=diff[i-1];
        }
        return diff;
    }
};