LeetCode 1109.Corporate Flight Bookings

LeetCode 1109. Corporate Flight Bookings (航班预订统计)

题目

链接

https://leetcode-cn.com/problems/corporate-flight-bookings/submissions/

问题描述

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

有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。

请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。

示例

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
解释:
航班编号 1 2 3 4 5
预订记录 1 : 10 10
预订记录 2 : 20 20
预订记录 3 : 25 25 25 25
总座位数: 10 55 45 25 25
因此,answer = [10,55,45,25,25]

提示

1 <= n <= 2 * 104
1 <= bookings.length <= 2 * 104
bookings[i].length == 3
1 <= firsti <= lasti <= n
1 <= seatsi <= 104

思路

差分数组的思路,与1094相似。

首先设置differ数组,存放每个航班和前一个航班的人数差,一直计算完每个booking,之后根据differ数组计算每个航班的人数。这里需要考虑到-1,因为航班号和下标差距是1.

复杂度分析

时间复杂度 O(max(m,n))
空间复杂度 O(n)

代码

Java

public int[] corpFlightBookings(int[][] bookings, int n) {
        int []differ = new int[n];
        int []ans = new int[n];
        for(int [] booking : bookings){
            int s = booking[0];
            int e = booking[1];
            int num = booking[2];
            differ[s-1] += num;
            if(e<n){
                differ[e] -= num;
            }
  
        }
        ans[0] = differ[0];
        for(int i = 1;i<n;i++){
            ans[i] = ans[i-1] +differ[i];
        }
        return ans;
    }
posted @ 2022-03-06 16:55  cheng102e  阅读(32)  评论(0编辑  收藏  举报