1. 程式人生 > 其它 >LeetCode——1109. 航班預訂統計(Java)

LeetCode——1109. 航班預訂統計(Java)

題目描述

題幹:
這裡有n個航班,它們分別從 1 到 n 進行編號。
有一份航班預訂表bookings ,表中第i條預訂記錄bookings[i] = [firsti, lasti, seatsi]
意味著在從 firsti到 lasti (包含 firsti 和 lasti )的 每個航班 上預訂了 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]

題解思路

返回每列航班所需要的座位數,經典的範圍陣列題目,直接想到差分陣列或者線段樹

因為題目明朗,所以採用差分陣列的思路,遵循 a[i]=a[i-1]+d[i] 的公式

具體含義就是找到原始陣列和最終陣列的差分陣列,最後通過移項得到變化量陣列

正確程式碼

    public int[] corpFlightBookings(int[][] bookings, int n) {
        int[] nums = new int[n];

        for (int[] booking : bookings) {
            nums[booking[0] - 1] += booking[2];
            if (booking[1] < n) {
                nums[booking[1]] -= booking[2];
            }
        }

        for (int i = 1; i < n; i++) {
            nums[i] += nums[i - 1];
        }

        return nums;
    }

總結

差分陣列的思想多用於區間元素同時增加或減少相同的數的情況

具體解析原理請詳看其他文章,以後我自己也會寫一些自己的新的體會

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見