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?