坐上公交的最晚时间
难度:
标签:
题目描述
代码结果
运行时间: 102 ms, 内存: 34.5 MB
// 思路:
// 1. 使用Java Stream对buses和passengers数组进行排序。
// 2. 遍历每一辆公交车,逐个处理每位乘客。
// 3. 记录每辆车搭载的乘客数量,直到车满或没有更多的乘客符合条件。
// 4. 找到最后一辆公交车可以搭乘的最晚到达时间。
// 5. 确保返回的时间不能与其他乘客到达时间相同。
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public int latestTimeCatchTheBus(int[] buses, int[] passengers, int capacity) {
buses = IntStream.of(buses).sorted().toArray();
passengers = IntStream.of(passengers).sorted().toArray();
int passengerIndex = 0;
int lastTime = 0;
for (int bus : buses) {
int count = 0;
while (passengerIndex < passengers.length && passengers[passengerIndex] <= bus && count < capacity) {
lastTime = passengers[passengerIndex];
passengerIndex++;
count++;
}
if (count < capacity) {
lastTime = bus;
}
}
while (IntStream.of(passengers).anyMatch(p -> p == lastTime)) {
lastTime--;
}
return lastTime;
}
}
解释
方法:
首先,对公交车和乘客的到达时间进行排序,确保处理时是按时间顺序进行的。然后,使用一个指针 R 遍历乘客数组,另外通过外层循环遍历每辆公交车。对于每辆公交车,我们检查如果当前乘客的到达时间小于等于该公交车的出发时间,并且该车还有空位,那么该乘客可以乘坐这辆公交车。在处理完所有公交车后,检查最后一辆公交车是否还有空位。如果有,最晚的时间就是这辆公交车的出发时间;如果没有空位,那么最晚时间应该是最后一个上车乘客的到达时间前一分钟。考虑到不能与其他乘客同时到达,我们在得到可能的最晚时间后,向前搜索直到找到一个不与任何乘客到达时间重合的时刻。
时间复杂度:
O(m log m + n log n)
空间复杂度:
O(log m + log n)