请你将一些箱子装在 一辆卡车 上。给你一个二维数组 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, numberOfUnitsPerBoxi <= 1000
1 <= truckSize <= 106
方法一:贪心
思路
只能装 truckSize 个箱子到卡车上,根据贪心的思路,只需要每次都拿当前剩下的箱子里单元数量最大的箱子即可。对 boxTypes 按照 numberOfUnitsPerBox 进行逆序排序,然后从左至右填充 truckSize 即可。
代码
[sol1-Python3]1 2 3 4 5 6 7 8 9 10 11
| class Solution: def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int: boxTypes.sort(key=lambda x: x[1], reverse=True) res = 0 for numberOfBoxes, numberOfUnitsPerBox in boxTypes: if numberOfBoxes >= truckSize: res += truckSize * numberOfUnitsPerBox break res += numberOfBoxes * numberOfUnitsPerBox truckSize -= numberOfBoxes return res
|
[sol1-C++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) { sort(boxTypes.begin(), boxTypes.end(), [](const vector<int> &a, const vector<int> &b) { return a[1] > b[1]; }); int res = 0; for (auto &boxType : boxTypes) { int numberOfBoxes = boxType[0]; int numberOfUnitsPerBox = boxType[1]; if (numberOfBoxes < truckSize) { res += numberOfBoxes * numberOfUnitsPerBox; truckSize -= numberOfBoxes; } else { res += truckSize * numberOfUnitsPerBox; break; } } return res; } };
|
[sol1-Java]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public int maximumUnits(int[][] boxTypes, int truckSize) { Arrays.sort(boxTypes, (a, b) -> b[1] - a[1]); int res = 0; for (int[] boxType : boxTypes) { int numberOfBoxes = boxType[0]; int numberOfUnitsPerBox = boxType[1]; if (numberOfBoxes < truckSize) { res += numberOfBoxes * numberOfUnitsPerBox; truckSize -= numberOfBoxes; } else { res += truckSize * numberOfUnitsPerBox; break; } } return res; } }
|
[sol1-C#]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Solution { public int MaximumUnits(int[][] boxTypes, int truckSize) { Array.Sort(boxTypes, (a, b) => b[1] - a[1]); int res = 0; foreach (int[] boxType in boxTypes) { int numberOfBoxes = boxType[0]; int numberOfUnitsPerBox = boxType[1]; if (numberOfBoxes < truckSize) { res += numberOfBoxes * numberOfUnitsPerBox; truckSize -= numberOfBoxes; } else { res += truckSize * numberOfUnitsPerBox; break; } } return res; } }
|
[sol1-C]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| static inline int cmp(const void *pa, const void *pb) { return (*(int **)pb)[1] - (*(int **)pa)[1]; }
int maximumUnits(int** boxTypes, int boxTypesSize, int* boxTypesColSize, int truckSize) { qsort(boxTypes, boxTypesSize, sizeof(int *), cmp); int res = 0; for (int i = 0; i < boxTypesSize; i++) { int numberOfBoxes = boxTypes[i][0]; int numberOfUnitsPerBox = boxTypes[i][1]; if (numberOfBoxes < truckSize) { res += numberOfBoxes * numberOfUnitsPerBox; truckSize -= numberOfBoxes; } else { res += truckSize * numberOfUnitsPerBox; break; } } return res; }
|
[sol1-JavaScript]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var maximumUnits = function(boxTypes, truckSize) { boxTypes.sort((a, b) => b[1] - a[1]); let res = 0; for (const boxType of boxTypes) { let numberOfBoxes = boxType[0]; let numberOfUnitsPerBox = boxType[1]; if (numberOfBoxes < truckSize) { res += numberOfBoxes * numberOfUnitsPerBox; truckSize -= numberOfBoxes; } else { res += truckSize * numberOfUnitsPerBox; break; } } return res; };
|
[sol1-Golang]1 2 3 4 5 6 7 8 9 10 11 12
| func maximumUnits(boxTypes [][]int, truckSize int) (ans int) { sort.Slice(boxTypes, func(i, j int) bool { return boxTypes[i][1] > boxTypes[j][1] }) for _, p := range boxTypes { if p[0] >= truckSize { ans += truckSize * p[1] break } truckSize -= p[0] ans += p[0] * p[1] } return }
|
复杂度分析