• LeetCode题目笔记——1710. 卡车上的最大单元数


    题目描述

    请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi] :

    numberOfBoxesi 是类型 i 的箱子的数量。
    numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。
    整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。

    返回卡车可以装载 单元 的 最大 总数。

    示例1:

    输入:boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4
    输出:8
    解释:箱子的情况如下:

    • 1 个第一类的箱子,里面含 3 个单元。
    • 2 个第二类的箱子,每个里面含 2 个单元。
    • 3 个第三类的箱子,每个里面含 1 个单元。 可以选择第一类和第二类的所有箱子,以及第三类的一个箱子。 单元总数 = (1 * 3) + (2 * 2) + (1 * 1) = 8

    示例2:

    输入:boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10
    输出:91

    提示:

    1 <= boxTypes.length <= 1000 1 <= numberOfBoxesi,
    numberOfUnitsPerBox i <= 1000
    1 <= truckSize <= 106

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/maximum-units-on-a-truck
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目难度——简单

    方法一:贪心

      题目的意思就要最大化可以装载的单元的数量,而装箱子的容量有限,那我们自然地想到优先装那些单位箱子里单元数目多的箱子,这样同等数目下的箱子,总的单元数才最多,于是我们可以对数据排个序,以第二维也就是单元数为依据进行降序排序,然后依次进行装箱,直到trucksize满或者所有箱子装完。

    代码/Python

    class Solution:
        def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
            boxTypes.sort(key=lambda item: item[1], reverse= True)
            res, i, box_num = 0, 0, len(boxTypes)
            while truckSize > 0 and i < box_num:
                n = min(truckSize, boxTypes[i][0])
                res += n * boxTypes[i][1]
                truckSize = max(0, truckSize - boxTypes[i][0])
                i += 1
    
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述  有点慢,看看能不能优化,上面用到了min和max函数,函数调用有一定开销,我们可以不用这两个函数,来加速,具体的,使用if else语句就可以实现找最大最小。

    class Solution:
        def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
            boxTypes.sort(key=lambda item: item[1], reverse= True)
            res, i, box_num = 0, 0, len(boxTypes)
            while truckSize > 0 and i < box_num:
                typ = boxTypes[i][0]
                unit = boxTypes[i][1]
                n = truckSize if truckSize < typ else typ
                res += n * boxTypes[i][1]
                truckSize = 0 if truckSize < typ else truckSize - typ
                i += 1
    
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
      可以看到还是快了不少的。

    代码/C++

    class Solution {
    public:
        int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
            sort(boxTypes.begin(), boxTypes.end(), [](vector<int> &A, vector<int> &B){
                    return A[1] > B[1];
            });
            int res, i, box_n, type, n;
            res = i = 0;
            box_n = boxTypes.size();
            while(i < box_n && truckSize > 0){
                type = boxTypes[i][0];
                n = truckSize < type ? truckSize : type;
                res += n * boxTypes[i][1];
                truckSize = truckSize < type ? 0 : truckSize - type;
                i++;
            }   
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    总结

      首先要排序,所以时间是O(NlogN),只用到了常数空间,所以空间是O(1)。

  • 相关阅读:
    Spring源码分析refresh()第一篇
    电子学:第012课——实验 13:烧烤 LED
    一款可以自动写代码的编辑器,解放你的双手
    java计算机毕业设计开放式教学评价管理系统源码+mysql数据库+系统+lw文档+部署
    Google protobuf使用技巧和经验总结
    Ceph入门到精通-sysctl参数优化
    qt 自定义控件 :取值范围
    为什么要使用动态代理IP?数据采集使用动态代理有哪些优势?
    JavaScript代码是怎么在浏览器里面运行起来的?
    C语言 100道经典编程题适用于专升本,专接本【详细分析版】
  • 原文地址:https://blog.csdn.net/weixin_44801799/article/details/127861777