• 【每日一题】1109. 航班预订统计


    1109. 航班预订统计 - 力扣(LeetCode)

    这里有 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
    预订记录 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. class Solution {
    2. public int[] corpFlightBookings(int[][] bookings, int n) {
    3. int[] dif = new int[n+1];
    4. int[] nums = new int[n];
    5. for(int i = 0; i < n ; i++) {
    6. dif[i] = 0;
    7. nums[i] = 0;
    8. }
    9. int len = bookings.length;
    10. for(int i = 0 ; i < len ; i++) {
    11. int num = bookings[i][2];
    12. int index1 = bookings[i][0]-1;
    13. int index2 = bookings[i][1];
    14. dif[index1] += num;
    15. dif[index2] -= num;
    16. }
    17. nums[0] = dif[0] ;
    18. for(int i = 1 ; i < n ; i++){
    19. nums[i] = dif[i] + nums[i-1];
    20. }
    21. return nums;
    22. }
    23. }

            每日一题,今天是中等题。这道题是标准的差分数组题,之后也会整理在零基础算法里面。

            读题。实际上就是有n个航班,每个航班会有人定位置,有人不止定一个航班的位置。实际上就是对一个初始全为0的数组进行加减运算而已。如果暴力解题的话,就是每次根据给所给的范围,给数组的每个位置进行加减,但我们可以使用差分数组来解题。

            差分数组实际上和前缀和差不多的思路,只是每个位置变成了这个位置和前一个位置的差。即dif[i] = num[i] - num[i-1]。所以,求解num[i]时可以得到:num[i]=dif[i]+num[i-1]。那么,如果你给dif数组的 i 位置加上一个数会怎么样?由上面的公式实际上可以知道,原数组i位置及其后面的位置都会加上这个数,相当于num[i]=dif[i]+num[i-1]+C(常数)。那减法就相通,相当于这个位置及其后面的位置都减去这个数字即:num[i]=dif[i]+num[i-1]-C(常数)。那如果我们给i位置加上一个数,给j(j>i)位置减去一个数,就相当于原数组[i,j)之间的所有数都加上了这个数。

            依据上述的所说,我们只需要构造一个dif的差分数组,就可以轻松地进行修改,最后只需要依据原数组(该题中全为0)以及差分数组,一次遍历就可以得到答案了。

            最后情况如下:

  • 相关阅读:
    网络编程牛牛牛牛牛
    #ifndef 与 #program once
    【Java并发编程三】线程的基本使用一
    什么是代码签名?代码签名的好处
    华为手机隐藏的这个功能,简直是办公旅人爱用好物
    6、数据结构
    手把手教你在ARM板上写一个驱动程序!
    并发编程之JMM&synchronized&volatile详解
    Java面试题总结2023
    2022牛客多校联赛第七场 题解
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/133714190