题目描述:
给你一个下标从 0 开始长度为 n 的整数数组 buses ,其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers ,其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。
给你一个整数 capacity ,表示每辆公交车 最多 能容纳的乘客数目。
每位乘客都会搭乘下一辆有座位的公交车。如果你在 y 时刻到达,公交在 x 时刻出发,满足 y <= x 且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。
返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
注意:数组 buses 和 passengers 不一定是有序的。
示例 1:
输入:buses = [10,20], passengers = [2,17,18,19], capacity = 2
输出:16
解释:
第 1 辆公交车载着第 1 位乘客。
第 2 辆公交车载着你和第 2 位乘客。
注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。
示例 2:
输入:buses = [20,30,10], passengers = [19,13,26,4,25,11,21], capacity = 2
输出:20
解释:
第 1 辆公交车载着第 4 位乘客。
第 2 辆公交车载着第 6 位和第 2 位乘客。
第 3 辆公交车载着第 1 位乘客和你。
解题思路:
1.对公交发车时间和乘客到达时间进行排序。
2.模拟每班车的发车过程,更新已乘坐的乘客数量。
3.确定最后一班车或最后一个能上车的乘客的时间。
4.逐步减小时间,直到找到最晚能够赶上车的时间。
代码解释:
// 排序乘客上车的时间
Arrays.sort(buses);
Arrays.sort(passengers);
// 初始化乘客位置索引为0
int pos = 0;
// 初始化每辆公交车剩余座位数为0
int space = 0;
// 遍历每个公交车的发车时间,当前车还有空位
for (int arrive : buses) {
// 初始化每辆车的剩余座位为capacity
space = capacity;
//并且还有乘客未上车,并且当前乘客可以在当前车发车前到达,则继续循环
while (space > 0 && pos < passengers.length && passengers[pos] <= arrive) {
space--;
pos++;
}
}
// 这里需要详细解释下为什么要回退一步?
// 在循环中,每次处理一个乘客时,会检查当前乘客是否可以在当前公交车发车前到达,
// 如果可以,就会让这个乘客上车,并将 pos 加1,表示处理了这个乘客
// 假设最后一班车的情况如下:
// 最后一班车的发车时间为 arrive。
// 假设最后一个乘客刚好可以赶上这班车,即 passengers[pos] <= arrive。
// 这时 pos 会加1,表示这个乘客已经处理完了,
// 但是,我们需要找到的是 最晚 能够赶上车的时间。因此
// 如果最后一班车还有空位 (space > 0),那么最晚时间就是最后一班车的发车时间 buses[buses.length - 1],
// 如果最后一班车已经满员 (space <= 0),那么最晚时间就是最后一个能上车的乘客的到达时间 passengers[pos]由于循环结束后 pos 已经指向了下一个乘客,
// 因此需要将 pos 减1,回退到上一个乘客,这样才能正确地获取最晚时间
pos--;
// 条件判断:space > 0 判断最后一班车是否还有空位。
// 如果 space > 0,说明最后一班车还有空位,那么最晚时间就是最后一班车的发车时间 buses[buses.length - 1]。
// 如果 space <= 0,说明最后一班车已经满员,那么最晚时间就是最后一个能上车的乘客的到达时间 passengers[pos]
int lastCatchTime = space > 0 ? buses[buses.length - 1] : passengers[pos];
// 如果当前位置有效 (pos >= 0) 并且当前乘客的到达时间等于最晚时间,则继续回退 pos 和减少 lastCatchTime,直到找到最晚能够赶上车的时间
while (pos >= 0 && passengers[pos] == lastCatchTime) {
pos--;
lastCatchTime--;
}
return lastCatchTime;
标签:passengers,2332,公交车,buses,乘客,pos,坐上,时间,最晚
From: https://www.cnblogs.com/java-cheng/p/18418134