这里有 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]
首先最直观的解法肯定是暴力破解啦,没什么好说的,循环就完事了
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] result = new int[n];
for (int[] num : bookings) {
for (int i = num[0]; i <= num[1]; i++) {
result[i - 1] += num[2];
}
}
return result;
}
第二种解法就是所谓差分
首先解释一下什么是差分,差分指的是一位元素与其相邻元素的差值,如num[n]-num[n-1]。差分数组即为每一位元素都是原本元素与其前一位相减所得到的差值组成的元素。
该题本质上是区间加减运算,因此我们只要得知区间的开头与结尾就可以知道该区间的差分数组,最后用前缀和还原即可
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] flight = new int[n];
for (int[] num:bookings){
flight[num[0]-1]+=num[2];
if (num[1]<n){
flight[num[1]]-=num[2];
}
}
for (int i=1;i< flight.length;i++){
flight[i]+=flight[i-1];
}
return flight;
}