【Leetcode】2594. 修车的最少时间——1915

题目

2594. 修车的最少时间

给你一个整数数组 ranks ,表示一些机械工的 能力值\(ranks_i\) 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 \(\bold{r * n^2}\) 分钟内修好 n 辆车。

同时给你一个整数 cars ,表示总共需要修理的汽车数目。

请你返回修理所有汽车 最少 需要多少时间。

注意:所有机械工可以同时修理汽车。

  • \(1\leq rans[i]\leq 100\)
  • \(1\leq ranks.length \leq 10^5\)

思路

可以发现的是,需要时间增多的话,可以维修的车一定是不会减小的,也就是存在正相关的关系,即递增。

那么我们就可以进行二分,对需要的时间进行二分,然后用时间进行判定可以修多少车。

class Solution:
    def repairCars(self, ranks: List[int], cars: int) -> int:
        n = len(ranks)
        def check(t):
            return sum([int(sqrt(t//x)) for x in ranks])>=cars
        return bisect_left(range(ranks[0]*cars*cars),True,key=check)

此外,可以发现的是,ranks[i]的范围很小,但是ranks的长度又很大,因此一定是存在许多重复的数字,可以提前进行计数,减小时间复杂度

class Solution:
    def repairCars(self, ranks: List[int], cars: int) -> int:
        cnt = Counter(ranks)
        def check(t):
            return sum([int(sqrt(t//x))*cnt[x] for x in cnt.keys()])>=cars
        return bisect_left(range(min(cnt.keys())*cars*cars),True,key=check)
posted @ 2024-09-20 13:31  TICSMC  阅读(40)  评论(0)    收藏  举报