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。