【LeetCode刷题】NO.4

273 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

1.题目

1109. 航班预订统计

这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。 请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。

示例 1:

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
解释:
航班编号        1   2   3   4   5
预订记录 110  10
预订记录 220  20
预订记录 325  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 <= n <= 2 * 10^4
  • 1 <= bookings.length <= 2 * 10^4
  • bookings[i].length == 3
  • 1 <= firsti <= lasti <= n
  • 1 <= seatsi <= 10^4

二、思路分析:

这个题目主要用到了差分数组的思想,因为题目中的问题我们可以理解为:航班预定表是一个数组,题目中所有的操作都建立在数组区间内的增减操作,一般我们遇到这种问题我们会不断地进行for循环然后对元素进行增减操作,但是这样解题思路的时间复杂度会非常高,因为不断的进行for循环。

所以以后对于数组区间内的增减操作我们需要考虑差分数组的思想: image.png

diff通过从起始位置的元素与后一位的元素相加一直循环到数组的最后一项,就能够还原这个数组,而当一个区间内进行增减操作的时候,只需要对差分数组的元素进行操作即可,因为一个区间内的增减操作,这个区间内的所有元素都是保持着不变的差值,所以我们只需要对区间的起始位置进行相加val值,对区间后一个位置的数组值进行相减val操作(需要考虑边界位置),这样就能够实现低时间复杂度的数组元素增减操作。

三、代码:

/**
 * @param {number[][]} bookings
 * @param {number} n
 * @return {number[]}
 */
var corpFlightBookings = function(bookings, n) {
    //利用差分数组求解
    let diff = new Array(n).fill(0)
    for(const booking of bookings){
        let [l,r,num] = booking
        diff[l-1] += num
        if(r<n){
            diff[r] -= num
        }
    }
    for(let i=1 ; i<n ; i++){
        diff[i] += diff[i-1] 
    }
    return diff
};

四、总结:

如果之后遇到对数组进行区间内元素增减值的时候,我们就要优先考虑使用差分数组的思想进行求解问题!希望这篇文章可以帮助大家0.0