LeetCode 1109 航班预定统计

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

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

请你返回一个长度为 n 的数组 answer,其中 answer[i] 是航班 i 上预订的座位总数。

示例 1:

输入: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]

示例 2:

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

前缀和+差分数组
以示例1为例:

/**
 * 前缀和
 *
 * @param bookings
 * @param n
 * @return
 */
public static int[] corpFlightBookings(int[][] bookings, int n) {
    if (bookings == null || bookings.length == 0) return new int[]{};

    // diff[i] 保存航班i相对于航班i-1处的变化,差分数组
    int[] diff = new int[n + 2];
    // 左端点+seatsi,右端点后面-seatsi,中间的状态不变,就省了给每个位置更新的时间
    for (int[] booking : bookings) {
        diff[booking[0]] += booking[2];
        diff[booking[1] + 1] -= booking[2];
    }

    // 前缀和
    int[] prefixSum = new int[n + 1];
    for (int i = 1; i <= n; i++) {
        diff[i] += diff[i - 1];
        prefixSum[i - 1] = diff[i];
    }

    return Arrays.copyOf(prefixSum, n);
}

测试用例

public static void main(String[] args) {
    int[][] bookings = new int[][]{{1, 2, 10}, {2, 3, 20}, {2, 5, 25}};
    int n = 5;
    int[] ans = CorpFlightBookings.corpFlightBookings(bookings, n);
    System.out.print("CorpFlightBookings demo01 result : ");
    for (int tmp : ans) {
        System.out.print("," + tmp);
    }
    System.out.println();

    bookings = new int[][]{{1, 2, 10}, {2, 2, 15}};
    n = 2;
    ans = CorpFlightBookings.corpFlightBookings(bookings, n);
    System.out.print("CorpFlightBookings demo02 result : ");
    for (int tmp : ans) {
        System.out.print("," + tmp);
    }
    System.out.println();
}
posted @ 2021-07-24 14:24  枫叶艾辰  阅读(42)  评论(0编辑  收藏  举报