• 【LeetCode - 每日一题】2594. 修车的最少时间(23.09.07)


    2594. 修车的最少时间

    题意

    • 给定每个师傅修车的时间和需要修的车辆总数,计算修理所有汽车需要的最少时间。
    • 师傅可以同时修车。

    解法 二分

    看到题目没有任何头绪,直接查看题解。

    至于为什么用二分做呢,讨论区有个友友这么说到:
    在这里插入图片描述

    对于修理时间 t t t 来说:

    • t t t 时间内可以修理完所有车,则大于等于 t t t 时间都可以修理完车;
    • t t t时间内不能修理完所有车,则小于等于 t t t 时间也不能修理完车;

    存在单调性。因此,假设最少需要 t i m e time time 时间,那么我们要找的就是第一个大于等于 t i m e time time 的时间 t t t

    所以可以直接套板子:

    class Solution {
    public:
        long long repairCars(vector<int>& ranks, int cars) {
            long long maxTime = (long long)*max_element(ranks.begin(), ranks.end()) * cars * cars;
    
            long long left = 0, right = maxTime, middle;
            
            long long maxCar = 0;
            while(left < right)
            {
                long long middle = (left +right) / 2;
                maxCar = 0;
                for(auto rank :ranks)
                {
                    maxCar += sqrt(middle / rank);  
                }
                // cout << left << " " << right << " " << middle << " " << maxCar << endl;
                
                if(maxCar < cars)
                {
                    left = middle + 1;
                }
                else if(maxCar >= cars)
                {
    
                    right = middle;
                }
            }
            return left;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    另一种写法:

    class Solution {
    public:
        long long repairCars(vector<int>& ranks, int cars) {
            long long maxTime = (long long)*max_element(ranks.begin(), ranks.end()) * cars * cars;
    
            long long left = 0, right = maxTime, middle;
            
            long long maxCar = 0;
            while(left <= right)
            {
                long long middle = (left +right) / 2;
                maxCar = 0;
                for(auto rank :ranks)
                {
                    maxCar += sqrt(middle / rank);  
                }
                // cout << left << " " << right << " " << middle << " " << maxCar << endl;
                
                if(maxCar < cars)
                {
                    left = middle + 1;
                }
                else if(maxCar > cars)
                {
    
                    right = middle - 1;
                }
                else if(maxCar == cars)
                {
                    right = middle - 1;
                }
            }
            return left;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    板子:

    int lower_bound(int a[],int left,int right,int x) 	//第一个小于等于x的数的位置 
    {
    	int mid;
    	while(left<right)
    	{
    		mid=(left+right)/2;
    		if(a[mid]>=x)
    			right=mid;
    		else
    			left=mid+1;
    	}
    	return left;
    }
    
    int lower_bound(int a[],int left,int right,int x) 	//第一个小于等于x的数的位置 
    {
    	int mid;
    	while(left<=right)
    	{
    		mid=(left+right)/2;
    		if(a[mid]>=x)
    			right=mid-1;
    		else
    			left=mid+1;
    	}
    	return left;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    复杂度

    时间复杂度:O( r a n k s . s i z e ( ) ∗ ( log ⁡ m a x ( r a n k ∗ c a r s ∗ c a r s ) ) ranks.size() * (\log max(rank*cars*cars)) ranks.size()(logmax(rankcarscars)) ),每一次二分都要遍历 ranks 数组计算可修理最大车辆数。
    空间复杂度:O(1),常数个变量。


  • 相关阅读:
    【2023双非保研】信管跨保计算机大类的记录(东南、川大、重大、东北、西电、南理工、杭高院、河海、东华、天大等)
    世界互联网大会领先科技奖发布 百度知识增强大语言模型关键技术获奖
    指数期货品种联动(指数期货类型)
    聚类 监督聚类 k-means聚类
    Linux之防火墙
    大数据面试题:MapReduce压缩方式
    (计算机组成原理)第四章指令系统-第三节2、3、4、5:常用的x86汇编指令、选择和循环语句的机器级表示
    你们还不知道这几个实用的思维导图app吗?
    学习笔记8--智能驾驶的功能安全设计之功能安全与ISO 26262标准
    一文带你了解内部开发者门户
  • 原文地址:https://blog.csdn.net/weixin_43736572/article/details/132742238