|

楼主 |
发表于 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个乘客。通过统计每个站台的上下人数和上一个站台的人员信息就能确定出整个航线的预定信息。
- /**
- * Note: The returned array must be malloced, assume caller calls free().
- */
- #define MAX_CNT 20000
- int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
- int *result;
- int *p;
- int i, j;
- if (!bookings || !bookingsSize || !bookingsColSize || !returnSize || !bookings[0]) {
- if (returnSize) {
- *returnSize = 0;
- }
- return NULL;
- }
- //printf("bookingsSize=%d, bookingsColSize=%d, n=%d\n", bookingsSize, *bookingsColSize, n);
- result = (int*)malloc(sizeof(int) * n);
- p = (int*)malloc(sizeof(int) * n);
- memset(result, 0, sizeof(int) * n);
- memset(p, 0, sizeof(int) * n);
- for (i = 0; i < bookingsSize; i++) {
- p[bookings[i][0] - 1] += bookings[i][2];
- if (bookings[i][1] < n) {
- p[bookings[i][1]] -= bookings[i][2];
- }
- }
- result[0] = p[0];
- for (i = 1; i < n; i++) {
- result[i] = result[i - 1] + p[i];
- }
- *returnSize = n;
- //printf("returnSize=%d\n", *returnSize);
- return result;
- }
复制代码 执行结果:通过
显示详情
执行用时 :348 ms, 在所有 C 提交中击败了92.11%的用户
内存消耗 :33.8 MB, 在所有 C 提交中击败了100.00%的用户
|
|