题目
这里有n
个航班,它们分别从1
到n
进行编号。
有一份航班预订表bookings
,表中第i
条预订记录bookings[i] = [first i, last i, seats i]
意味着在从first i
到last i
(包含first i
和last i
)的 每个航班 上预订了seats i
个座位。
请你返回一个长度为n
的数组answer
,其中answer[i]
是航班i
上预订的座位总数。
题解
上来就暴力解结果超时。= =
思路:利用差分数组,由原数组每个元素减去前一个元素得到。注意差分数组的重要性质:若需要对原数组的某区间[l, r]
增加一个增量inc
(可为负),可以对差分数组dif[]
进行操作:dif[l] += inc
,dif[r + 1] -= inc
,即可实现。
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> booknum(n, 0); // 存储差分数组
for(auto &s : bookings){ // 实现差分数组的区间增加
booknum[s[0] - 1] += s[2];
if(s[1] != n)
booknum[s[1]] -= s[2];
}
for(int i = 0; i < n - 1; i++) // 通过差分数组恢复原数组
booknum[i + 1] += booknum[i];
return booknum;
}
一个小小的踩坑:输入中的航班号从1开始,直接用作索引会导致溢出。