1109.航班预定统计
-
题目
这里有 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]
-
难度:中等
-
分类:多看
-
题解
-
刚看到这题,我相信很多人的第一反应和我的做法是一样的那就是直接声明数组然后暴力求解,觉得这道题很简单,而且代码量也很低。代码如下:
class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { int []res = new int [n]; Arrays.fill(res,0); for(int []temp:bookings) { for(int i=temp[0]-1;i<temp[1];i++) { res[i]+=temp[2]; } } return res; } }
那么按照以上方式提交的结果则是:
可见取得的效果并不好,而且也并不提倡,在评论区也可以知道该题作为华为面试题,一位大佬用了上述的暴力破解法最终面试了十分钟就结束。而该题作为中等难度题,一定有其原因的,面对效果不好的代码,我们也要懂得思考如何去优化,下面主要是官方题解的优化方法。
-
优化
优化算法其实就有点精妙了,其用到了差分的可叠加的方法,或许这样子讲还是有点不容易理解,我们用一个例子来简单说明这个方法:
首先我们拿出两个数组[1,2,3,4,5],[2,4,6,8,10],那么他们对位相加等于[3,6,9,12,15],现在我们将两个数组进行差分表示[1,1,1,1,1],[2,2,2,2,2]。关于差分的转化,其实是:
n u m s [ i ] = n u m s [ i ] − n u m s [ i − 1 ] nums[i]=nums[i]-nums[i-1] nums[i]=nums[i]−nums[i−1]
那么差分转正常数组则是:
当 i = 0 时 n u m s [ i ] = n u m s [ i ] 当i=0时 nums[i]=nums[i] 当i=0时nums[i]=nums[i]当 i 不 等 于 0 时 n u m s [ i ] = n u m s [ i ] + n u m s [ i − 1 ] 当i不等于0时 nums[i]=nums[i]+nums[i-1] 当i不等于0时nums[i]=nums[i]+nums[i−1]
那么我们把那两个差分数组加起来可以得到[3,3,3,3,3],我们再回复到原始数组则为:[3,6,9,12,15]。
通过上述的方法,我们应用到这道题中。为了更加直观地让大家知道这个算法的应用过程,那么我们还是通过例子来说明。
示例 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]对于数组[1,2,10]来说他表示下表0到1的增量为10,那么1到2的增量为多少呢?答案为-10。数组[2,3,20]来说表示1到2的增量为20,那么2到3的增量为-20。同时通过上面的差分可叠加的性质,我们就能够很容易地解决这个问题了。代码如下:
class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { int []res=new int [n]; for(int []temp:bookings) { res[temp[0]-1]+=temp[2]; if(temp[1]<n) { res[temp[1]]-=temp[2]; } } for(int i=1;i<n;i++) { res[i]+=res[i-1]; } return res; } }
那么取得的结果为:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/corporate-flight-bookings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。