今天刷到一个题。典型的前缀和+差分解法的题。简直妙不可言,故提笔记之
题目如下
这是一道很典型的对n个区间进行增量。若是我们用暴力法的话,那事件复杂度将会是n*m。而区间问题恰好是差分所能解决的领域。而且差分的前缀和就是原数组。所以我们可以将这个题分成两步
- 初始化差分数组
- 对差分数组求前缀和,得到原数组
代码如下:
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
//差分;
vector<int> ans(n, 0);
for(auto &e: bookings){
ans[e[0]-1]+=e[2];
if(e[1]<n)ans[e[1]]-=e[2];
}
//做前缀和
for(int i=1;i<n; i++){
ans[i]+=ans[i-1];
}
return ans;
}
};
虽然这代码只有短短几行,但却是充满了智慧。又深刻的感受到了算法的魅力了。