LeetCode-1109-航班预订统计

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[i1]
    那么差分转正常数组则是:
    当 i = 0 时 n u m s [ i ] = n u m s [ i ] 当i=0时 nums[i]=nums[i] i=0nums[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] i0nums[i]=nums[i]+nums[i1]

    那么我们把那两个差分数组加起来可以得到[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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值