共计 1238 个字符,预计需要花费 4 分钟才能阅读完成。
前言
Weekly Contest 144 的 航班预订统计:
这里有
n
个航班,它们分别从1
到n
进行编号。我们这儿有一份航班预订表,表中第
i
条预订记录bookings[i] = [i, j, k]
意味着我们在从i
到j
的每个航班上预订了k
个座位。请你返回一个长度为
n
的数组answer
,按航班编号顺序返回每个航班上预订的座位数。示例:
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5 输出:[10,55,45,25,25]
提示:
1 <= bookings.length <= 20000
1 <= bookings[i][0] <= bookings[i][1] <= n <= 20000
1 <= bookings[i][2] <= 10000
解题思路
本题题目的思路其实比较简答:
- 读取出每条预定记录
bookings[i] = [i, j, k]
的起点i
,终点j
和座位数k
- 处于起点
i
和j
之间的result[n]
需要增加对应的座位数k
,即若i<=n+1<=k
(因为n
为数组下标索引,所以需要n+1
),则result[n]+=k
下面会通过题目的示例分析:
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
运算过程
-
第
1
行数据[1,2,10]
表示起点是1
,终点是2
,座位数是10
。所以result[0]+=10
,result[1]+=10
。此时result[0]=10 result[1]=10 result[2]=0 result[3]=0 result[4]=0
-
第
2
行数据[2,3,20]
表示起点是2
,终点是3
,座位数是20
。所以result[1]+=20
,result[2]+=20
。此时result[0]=10 result[1]=30 result[2]=20 result[3]=0 result[4]=0
-
第
3
行数据[2,5,25]
表示起点是2
,终点是5
,座位数是15
。所以result[1]+=25
,result[2]+=25
,result[3]+=25
,result[4]+=25
。此时result[0]=10 result[1]=55 result[2]=45 result[3]=25 result[4]=25
实现代码
/**
* 5118. 航班预订统计
* @param bookings
* @param n
* @return
*/
public int[] corpFlightBookings(int[][] bookings, int n) {int[] result = new int[n];
for (int i = 0; i < bookings.length; i++) { // 处理每一条预订记录
int start = bookings[i][0];
int end = bookings[i][1];
int seat = bookings[i][2];
for (int j = start - 1; j < end; j++) { // 给对应航班编号增加座位数
result[j] += seat;
}
}
return result;
}
正文完