刷题日记 1710. 卡车上的最大单元数

116 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
  }
};

范文参考:

C++ 二维vector排序+判定 - 卡车上的最大单元数 - 力扣(LeetCode)

是否使用匿名函数 - 卡车上的最大单元数 - 力扣(LeetCode)