持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
1710. 卡车上的最大单元数 - 力扣(LeetCode)
请你将一些箱子装在 一辆卡车 上。给你一个二维数组 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 <= 10^6
二、思路分析:
- boxTypes 数组按每一项的 numberOfUnitsPerBoxi 从大到小进行排序
- 遍历数组,若容量 truckSize 大于等于当前数组项的 numberOfBoxesi 值,总单元数加数组当前项的 numberOfBoxesi * numberOfUnitsPerBoxi,容量 truckSize 减去当前数组项的 numberOfBoxesi ;若已遍历到数组最后一位,但是容量仍大于 0 ,直接返回最大单元数(说明没装满);若容量小于当前数组项的 numberOfBoxesi ,最大单元值就为容量 truckSize * 当前数组项的 numberOfUnitsPerBoxi 。
三、AC 代码:
/**
* @param {number[][]} boxTypes
* @param {number} truckSize
* @return {number}
*/
var maximumUnits = function (boxTypes, truckSize) {
boxTypes = boxTypes.sort((a, b) => b[1] - a[1]);
var count = 0;
for (var i = 0; i < boxTypes.length; i++) {
if (truckSize >= boxTypes[i][0]) {
count += boxTypes[i][1] * boxTypes[i][0];
truckSize -= boxTypes[i][0];
if ((i === boxTypes.length - 1) && truckSize > 0) {
return count;
}
} else {
count += boxTypes[i][1] * truckSize;
return count;
}
}
};