2021-12-25数组链表day2

今日练习:差分数组

题1:

这里有 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 <= n <= 2 * 104
  • 1 <= bookings.length <= 2 * 104
  • bookings[i].length == 3
  • 1 <= firsti <= lasti <= n
  • 1 <= seatsi <= 104
 1 class Solution {
 2     public int[] corpFlightBookings(int[][] bookings, int n) {
 3         int[] diff=new int[n];
 4         for (int i=0;i<bookings.length;i++){
 5             int l=bookings[i][0];
 6             int r=bookings[i][1];
 7             int val=bookings[i][2];
 8             diff[l-1]+=val;
 9             if (r<n) diff[r]-=val;
10         }
11         for(int i=1;i<n;i++){
12             diff[i]+=diff[i-1];
13         }
14         return diff;
15     }
16 }

典型的差分数组思想,注意下标位置,以及对于初始数组为0的情况,差分数组前缀和就是原数组。

题2:

假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。

这儿有一份乘客行程计划表 trips[][],其中 trips[i] = [num_passengers, start_location, end_location] 包含了第 i 组乘客的行程信息:

  • 必须接送的乘客数量;
  • 乘客的上车地点;
  • 以及乘客的下车地点。

这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。

请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false)。

 

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false

示例 2:

输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true

示例 3:

输入:trips = [[2,1,5],[3,5,7]], capacity = 3
输出:true

示例 4:

输入:trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
输出:true

 

提示:

  • 你可以假设乘客会自觉遵守 “先下后上” 的良好素质
  • trips.length <= 1000
  • trips[i].length == 3
  • 1 <= trips[i][0] <= 100
  • 0 <= trips[i][1] < trips[i][2] <= 1000
  • 1 <= capacity <= 100000
 1 class Solution {
 2     public boolean carPooling(int[][] trips, int capacity) {
 3         int[] diff=new int[1001];
 4         int max=-1;
 5         for (int[] trip:trips){
 6             diff[trip[1]]+=trip[0];
 7             diff[trip[2]]-=trip[0];
 8             max=Math.max(max,trip[2]);
 9         }
10         //System.out.print(Arrays.toString(diff));
11         if (diff[0]>capacity) return false;
12         for (int i=1;i<=max;i++){
13             diff[i]+=diff[i-1];
14             if (diff[i]>capacity) return false;
15         }
16         return true;
17     }
18 }

同样是差分数组思想,计算出每一站承载的客人数。需要注意的是,对于每一段,认为起始点为闭区间,到达点为开区间,因为乘客先下后上,因此对于[i,j),将diff[i ]+val,diff[j ]-val。

posted on 2021-12-25 20:01  阿ming  阅读(30)  评论(0编辑  收藏  举报

导航