差分

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

这是我刷题过程中第一道运用差分思想的题目;题意很简单,给定多个需求[起点,终点,航班数],序号为[起点,终点]之间的每个航班都被预定了需求中的航班数。

这是一道模版题,看了题解中三叶(超感谢!!)的讲解主要是维护一个差分数组c

                           c[l]+=v 代表[l,末尾]区间内的航班数都加上v

     但是我们的需求是[l,r]区间内航班加上v,所以很妙的地方来了,我们需要使得:c[r+1]-=v. 这样就代表r+1及以后的航班都减去v,从而消除了上一步对r+1及以后的航班的影响

     最后计算每个航班拥有的航班数利用了前缀思想: ans[i]=ans[i-1]+c[l];

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> c(n+2,0);
        for(int i=0;i<bookings.size();i++){
            vector<int> book=bookings[i];
            int l=book[0]-1,r=book[1]-1,v=book[2];
            c[l]+=v;
            c[r+1]-=v;
        }
        vector<int> ans;
        ans.push_back(c[0]);
        for(int i=1;i<n;i++){
            ans.push_back(ans[i-1]+c[i]);
        }
        return ans;
    }
};

 

posted @ 2022-03-09 11:01  一只很皮的猴猴  阅读(130)  评论(0编辑  收藏  举报