0%

『LeetCode』1710 卡车上的最大单元数

题目

1710. 卡车上的最大单元数

请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxes^{i}, numberOfUnitsPerBox^{i}]

  • numberOfBoxes^{i} 是类型 i 的箱子的数量。
  • numberOfUnitsPerBox^{i}^{ }是类型 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 <= numberOfBoxes^{i}, numberOfUnitsPerBox^{i} <= 1000\)
  • \(1 <= truckSize <= 10^{6}\)

标签

贪心, 数组, 排序


题解

【卡车上的最大单元数】简单贪心排序

贪心

欲要使单元数量最多,那肯定是先选择单元数数量多的箱子,实现上先排序后遍历取箱子即可

因为数据量不大,所以计数排序可能会更快

1
2
3
4
5
6
7
8
9
10
# Code language: Python
class Solution:
def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
boxTypes.sort(key=lambda x: x[1], reverse=True)
ans = 0
for i, j in boxTypes:
ans += min(i, truckSize) * j
truckSize -= i
if truckSize <= 0: break
return ans
1
2
3
4
5
6
7
8
9
10
11
12
// Code language: Java
class Solution {
public int maximumUnits(int[][] boxTypes, int truckSize) {
Arrays.sort(boxTypes, (a,b)->b[1]-a[1]);
int ans = 0;
for (int i = 0, n = boxTypes.length; i < n && truckSize > 0; ++i) {
ans += Math.min(boxTypes[i][0], truckSize) * boxTypes[i][1];
truckSize -= boxTypes[i][0];
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// Code language: 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 ans = 0;
for (int i = 0, n = boxTypes.size(); i < n && truckSize > 0; i++) {
ans += min(boxTypes[i][0], truckSize) * boxTypes[i][1];
truckSize -= boxTypes[i][0];
}
return ans;
}
};
  • 时间复杂度: \(O(n \log n)\)
  • 空间复杂度: \(O(\log n)\), 视排序算法而定

计数排序

1
2
3
4
5
6
7
8
9
10
11
12
# Code language: Python
class Solution:
def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
s = [0] * 1007
for i, j in boxTypes: s[j] += i
ans = 0
for i, j in zip(count(1006, -1), reversed(s)):
if j > 0:
ans += min(j, truckSize) * i
truckSize -= j
if truckSize <= 0: break
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Code language: Java
class Solution {
public int maximumUnits(int[][] boxTypes, int truckSize) {
int[] s = new int[1007];
int ans = 0;
for (int i = 0, n = boxTypes.length; i < n; ++i) s[boxTypes[i][1]] += boxTypes[i][0];
for (int i = 1000; i > 0 && truckSize > 0; i--) {
if (s[i] > 0) {
ans += Math.min(s[i], truckSize) * i;
truckSize -= s[i];
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Code language: C++
class Solution {
public:
int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
int s[1007]{0};
int ans = 0;
for (int i = 0, n = boxTypes.size(); i < n; ++i) s[boxTypes[i][1]] += boxTypes[i][0];
for (int i = 1000; i > 0 && truckSize > 0; i--) {
if (s[i] > 0) {
ans += min(s[i], truckSize) * i;
truckSize -= s[i];
}
}
return ans;
}
};
  • 时间复杂度: \(O(n + C)\), \(C\) 为固定值 \(1000\)
  • 空间复杂度: \(O(C)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~