5118航班预订统计

32次阅读

共计 1238 个字符,预计需要花费 4 分钟才能阅读完成。

前言

Weekly Contest 144 的 航班预订统计:

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

我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [i, j, k] 意味着我们在从 ij 的每个航班上预订了 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[i][0] <= bookings[i][1] <= n <= 20000
  • 1 <= bookings[i][2] <= 10000

解题思路

本题题目的思路其实比较简答:

  1. 读取出每条预定记录 bookings[i] = [i, j, k] 的起点 i,终点j 和座位数k
  2. 处于起点 ij之间的 result[n] 需要增加对应的座位数 k,即若i<=n+1<=k(因为n 为数组下标索引,所以需要n+1),则result[n]+=k

下面会通过题目的示例分析:

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

运算过程

  1. 1 行数据 [1,2,10] 表示起点是1,终点是2,座位数是10。所以result[0]+=10result[1]+=10。此时

    result[0]=10
    result[1]=10
    result[2]=0
    result[3]=0
    result[4]=0
  2. 2 行数据 [2,3,20] 表示起点是2,终点是3,座位数是20。所以result[1]+=20result[2]+=20。此时

    result[0]=10
    result[1]=30
    result[2]=20
    result[3]=0
    result[4]=0
  3. 3 行数据 [2,5,25] 表示起点是2,终点是5,座位数是15。所以result[1]+=25result[2]+=25result[3]+=25result[4]+=25。此时

    result[0]=10
    result[1]=55
    result[2]=45
    result[3]=25
    result[4]=25

实现代码

    /**
     * 5118. 航班预订统计
     * @param bookings
     * @param n
     * @return
     */
    public int[] corpFlightBookings(int[][] bookings, int n) {int[] result = new int[n]; 
        for (int i = 0; i < bookings.length; i++) { // 处理每一条预订记录
            int start = bookings[i][0];
            int end = bookings[i][1];
            int seat = bookings[i][2];
            for (int j = start - 1; j < end; j++) { // 给对应航班编号增加座位数
                result[j] += seat;
            }
        }
        return result;
    }

正文完
 0