2594. Minimum Time to Repair Cars

T: O(nlogm), n is the len of ranks array, m is search range
S: O(1)
class Solution {
    public long repairCars(int[] ranks, int cars) {
        long maxRank = 1;
        for (int r : ranks) {
            maxRank = Math.max(maxRank, r);
        }
        long left = 1;
        long right = maxRank*cars*cars;

        while (left <= right) {
            long mid = left + (right - left)/2;
            if (isAbleToRepair(mid, ranks, cars)) {
                if (mid == 1 || !isAbleToRepair(mid-1, ranks, cars)) {
                    return mid;
                }
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return 1;
    }
    private boolean isAbleToRepair(long time, int[] ranks, int cars) {
        int fixedCars = 0;
        for (int rank : ranks) {
            fixedCars += Math.sqrt(time/rank);
        }
        return fixedCars >= cars;
    }
}

/**
t = r*n^2

sqrt(t/r) = n

so use which t -> to make n >= cars

4*10^2 = 400

search range: 1 to max time

T: O(nlogm), n is the len of ranks array, m is search range
S: O(1)
 */

Last updated

Was this helpful?