LeetCode每日一题 2594. 修车的最少时间

题目描述

给定一个整数数组 ranks,表示一些机械工的能力值。其中 ranks[i] 是第 i 位机械工的能力值,表示能够在 ranks[i] * n^2 分钟内修好 n 辆车。同时,给定一个整数 cars,表示总共需要修理的汽车数目。要求计算修理所有汽车所需的最少时间。

算法思路

这个问题可以通过二分查找来解决。我们可以使用二分查找来确定一个时间 t,然后检查是否有足够多的机械工能够在时间 t 内修好所有的汽车。具体步骤如下:

  1. 初始化左边界 l 为 0 和右边界 r 为一个较大的值,例如 2 * ranks[0] * cars * cars。这是一个初始的搜索范围。

  2. 进入二分查找循环,继续查找直到左边界小于右边界。

  3. 在每一次循环中,计算中间值 m = (l + r) / 2。

  4. 使用 m 和机械工的能力值 ranks 来估算在时间 m 内可以修好多少辆车。遍历 ranks 数组,对于每个能力值 rk,计算 sqrt(m / rk) 并累加到 num 中。这是因为 rk * n^2 表示能够在 rk * n^2 分钟内修好 n 辆车,所以 sqrt(m / rk) 表示在时间 m 内可以修好的车辆数目。

  5. 检查 num 是否大于或等于 cars。如果是,则表示在时间 m 内可以修好足够多的汽车,将右边界 r 更新为 m。如果不是,则表示在时间 m 内无法修好足够多的汽车,将左边界 l 更新为 m + 1。

  6. 最终返回左边界 l,即为修理所有汽车所需的最少时间。

代码实现

class Solution {
public:
    long long repairCars(vector<int>& ranks, int cars) {
        long long l = 0, r = 2ll * ranks[0] * cars * cars;
        while (l < r) {
            auto m = (l + r) >> 1;
            long long num = 0;
            for (auto rk : ranks) {
                num += sqrt(m / rk);
            }
            if (num >= cars) {
                r = m;
            } else {
                l = m + 1;
            }
        }
        return l;
    }
};

时间复杂度:O(N * log(M)),其中 N 为机械工的数量,M 为搜索的范围,因为我们进行了二分查找。
空间复杂度:O(1),没有使用额外的数据结构,只使用了常量空间。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值