​ 坚持写博客是一个好习惯,日日精进。

20210831每日一题(get到差分法)

1109. 航班预订统计

1.暴力解法(面试官可能会挂人)

​ leetcoder 在评论区评论 这道题面试官给他30分钟,他3分钟写出暴力解法,直接被挂掉。

class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int len = bookings.length;
        int[] dp = new int[n];

        for(int[] booking:bookings){
            for(int i = booking[0]-1;i<booking[1];i++){
                dp[i]+= booking[2];
            }
        }
        return dp;

    }
}

2.差分法

​ 差分法比较抽象,就好像是后面的座位先拿走,处理时再还回去。

class Solution {
    //使用差分法(利用差分数组的性质解题)


    /**
        差分数组的性质就是前一个数加上nums[i] 就可以还原数组
        比如nums [1,2,2,4]
        cuts[i] = nums[i] - nums[i-1]
        其差分数组为cuts [1,1,0,2], 
        nums[1] = nums[0] + cut[1];

        根据题意来理解就是,座位我先给你加上,后面的先欠着所以就减去.
     */

    public int[] corpFlightBookings(int[][] bookings, int n) {
        int len = bookings.length;
        //差分数组
        int[] dp = new int[n];
        //首先遍历表
        for(int[] booking:bookings){
            //记录并求和所有出发航班的座位和
            dp[booking[0]-1] += booking[2];

            if(booking[1]<n){//判断目的地是不是不为终点(防止越界)

                dp[booking[1]]-=booking[2];

            }
        }
        //利用差分数组的性质进行数组还原
        for(int i=1;i<n;i++){
            dp[i]+=dp[i-1];
        }
        return dp;

    }
}