【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)

浙公网安备 33010602011771号