请你将一些箱子装在 一辆卡车 上。给你一个二维数组 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满或者所有箱子装完。
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
有点慢,看看能不能优化,上面用到了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
可以看到还是快了不少的。
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;
}
};
首先要排序,所以时间是O(NlogN),只用到了常数空间,所以空间是O(1)。