Minimum Time to Complete Trips

medium array binary search

Problem

Each bus i takes time[i] units per trip and they run in parallel. Given totalTrips, return the minimum time required for the buses combined to make at least totalTrips trips.

Inputtime = [1, 2, 3], totalTrips = 5
Output3
At t=3: bus0=3, bus1=1, bus2=1 → 5 trips total.

def minimum_time(time, total_trips):
    lo, hi = 1, min(time) * total_trips
    while lo < hi:
        mid = (lo + hi) // 2
        trips = sum(mid // t for t in time)
        if trips >= total_trips:
            hi = mid
        else:
            lo = mid + 1
    return lo
function minimumTime(time, totalTrips) {
  let lo = 1n, hi = BigInt(Math.min(...time)) * BigInt(totalTrips);
  while (lo < hi) {
    const mid = (lo + hi) / 2n;
    let trips = 0n;
    for (const t of time) trips += mid / BigInt(t);
    if (trips >= BigInt(totalTrips)) hi = mid;
    else lo = mid + 1n;
  }
  return Number(lo);
}
class Solution {
    public long minimumTime(int[] time, int totalTrips) {
        long lo = 1, hi = (long) java.util.Arrays.stream(time).min().getAsInt() * (long) totalTrips;
        while (lo < hi) {
            long mid = lo + (hi - lo) / 2;
            long trips = 0;
            for (int t : time) trips += mid / t;
            if (trips >= totalTrips) hi = mid;
            else lo = mid + 1;
        }
        return lo;
    }
}
long long minimumTime(vector<int>& time, int totalTrips) {
    long long lo = 1, hi = (long long) *min_element(time.begin(), time.end()) * totalTrips;
    while (lo < hi) {
        long long mid = lo + (hi - lo) / 2;
        long long trips = 0;
        for (int t : time) trips += mid / t;
        if (trips >= totalTrips) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}
Time: O(n log(min(time) · totalTrips)) Space: O(1)