Question The Latest Time to Catch a Bus
https://leetcode.com/problems/the-latest-time-to-catch-a-bus/description/
High Level && Detail Logic:
Detail Logic
public int lastestTimeCatchTheBus(int[] busDepartureTimes, int[] passengerArrivalTimes, int capacity) {
Arrays.sort(busDepartureTimes);
Arrays.sort(passengerArrivalTimes);
int currentTotalPassengers = 0;
int currBusCapacity = 0;
int lowerBoundArrivalTimeIndex = -1;
for (int busDepartureTime: busDepartureTimes) {
lowerBoundArrivalTimeIndex = getLowerBound(passengerArrivalTimes, busDepartureTime);
currBusCapacity = Math.min(capacity, lowerBoundArrivalTimeIndex - (currentTotalPassengers - 1));
currentTOtalPassengers += currBusCapacity;
}
if (currBusCpacity < capacity && (lowerBoundArrivalTimeIndex == -1 || passengerArrivalTimes[lowerBoundArrivalTimeIndex] + 1 <= busDepartureTimes[busDepartureTimes.length - 1])) {
return busDepartureTimes[busDepartureTimes.length - 1];
}
for (int i = currentTotalPassengers - 1; i >= 0; i--) {
if (i > 0 && [assengerArrivalTimes[i] - 1 != passengerArrivalTimes[i -1]) {
return passengerArrivalTimes[i] - 1;
}
}
return passengerArrivalTimes[0] - 1;
}
private int getLowerBound(int[] arr, int busArriveTime) {
int left = 0;
int right = arr.length - 1;
if (arr[left] > busArriveTime) {
return -1;
}
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (arr[mid] <= busArriveTime) {
left = mid;
} else {
right = mid -1;
}
}
if (arr[right] <= busArriveTime) {
return right;
}
if (arr[left] <= busArriveTime) {
return left;
}
return -1;
}Last updated