差分
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; } };