朝阳无限好 - Morning Sun Community

 找回密码
 注册
查看: 106|回复: 1

[中等] 1109. 航班预订统计

[复制链接]
发表于 2020-4-8 23:34:01 | 显示全部楼层 |阅读模式
本帖最后由 yzhms 于 2020-4-8 23:36 编辑

这里有 n 个航班,它们分别从 1 到 n 进行编号。

我们这儿有一份航班预订表,表中第 i 条预订记录 bookings = [i, j, k] 意味着我们在从 i 到 j 的每个航班上预订了 k 个座位。

请你返回一个长度为 n 的数组 answer,按航班编号顺序返回每个航班上预订的座位数。



示例:

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]


提示:

1 <= bookings.length <= 20000
1 <= bookings[0] <= bookings[1] <= n <= 20000
1 <= bookings[2] <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/corporate-flight-bookings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 楼主| 发表于 2020-4-8 23:35:09 | 显示全部楼层

航班预定---公交车模型
gpking 发布于 8 天前

此题按照自己的想法按照输入每次通过下标叠加到对应的航班次数。但是这样问题的时间复杂度为O(n*m)。在该题中只能通过一部分用例。

参照题解了解到了公交车上下的这种模型。

因为航班可以看做一系列的站台,公交车从第0个站台启动,每个站台有上有下,最终可以根据每站的上下确定出每站的乘客数量。

比如站台0上车4人,站台1下车2人,上车3人,这样站台1的变更数量就是1,此时车上的总人数是5人:4 + 1。

航班预定场景中:航线i和航线j增加了K个乘客。实际可以认为在航班i上车了K个乘客,乘坐到了j站台之后下车,即站台j+1处下车,-K个乘客。通过统计每个站台的上下人数和上一个站台的人员信息就能确定出整个航线的预定信息。

  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. #define MAX_CNT 20000
  5. int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
  6.     int *result;
  7.     int *p;
  8.     int i, j;
  9.     if (!bookings || !bookingsSize || !bookingsColSize || !returnSize || !bookings[0]) {
  10.         if (returnSize) {
  11.             *returnSize = 0;
  12.         }
  13.         return NULL;
  14.     }
  15.     //printf("bookingsSize=%d, bookingsColSize=%d, n=%d\n", bookingsSize, *bookingsColSize, n);
  16.     result = (int*)malloc(sizeof(int) * n);
  17.     p = (int*)malloc(sizeof(int) * n);
  18.     memset(result, 0, sizeof(int) * n);
  19.     memset(p, 0, sizeof(int) * n);

  20.     for (i = 0; i < bookingsSize; i++) {
  21.         p[bookings[i][0] - 1] += bookings[i][2];
  22.         if (bookings[i][1] < n) {
  23.             p[bookings[i][1]] -= bookings[i][2];
  24.         }
  25.     }
  26.     result[0] = p[0];
  27.     for (i = 1; i < n; i++) {
  28.         result[i] = result[i - 1] + p[i];
  29.     }
  30.     *returnSize = n;
  31.     //printf("returnSize=%d\n", *returnSize);
  32.     return result;
  33. }
复制代码
执行结果:通过
显示详情

执行用时 :348 ms, 在所有 C 提交中击败了92.11%的用户
内存消耗 :33.8 MB, 在所有 C 提交中击败了100.00%的用户

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|朝阳无限好 ( 琼ICP备19005269号-1 )

GMT+8, 2020-7-7 18:13 , Processed in 0.047008 second(s), 16 queries .

快速回复 返回顶部 返回列表