You are assigned to put some amount of boxes onto one truck. You are given a 2D array boxTypes
, where boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi]
:
numberOfBoxesi
is the number of boxes of type i
.numberOfUnitsPerBoxi
is the number of units in each box of the type i
.You are also given an integer truckSize
, which is the maximum number of boxes that can be put on the truck. You can choose any boxes to put on the truck as long as the number of boxes does not exceed truckSize
.
Return the maximum total number of units that can be put on the truck.
Example 1:
Input: boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4 Output: 8 Explanation: There are: - 1 box of the first type that contains 3 units. - 2 boxes of the second type that contain 2 units each. - 3 boxes of the third type that contain 1 unit each. You can take all the boxes of the first and second types, and one box of the third type. The total number of units will be = (1 * 3) + (2 * 2) + (1 * 1) = 8.
Example 2:
Input: boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10 Output: 91
Constraints:
1 <= boxTypes.length <= 1000
1 <= numberOfBoxesi, numberOfUnitsPerBoxi <= 1000
1 <= truckSize <= 106
You are given a 2D array boxTypes
, where boxTypes[i] = [numberOfBoxesᵢ, numberOfUnitsPerBoxᵢ]
. numberOfBoxesᵢ
represents the number of boxes of type i
, and numberOfUnitsPerBoxᵢ
represents the number of units in each box of type i
. You also have an integer truckSize
, representing the maximum number of boxes you can put on the truck. The goal is to determine the maximum total number of units that can be put on the truck.
The optimal solution involves a greedy approach. We prioritize loading boxes with the highest number of units per box first. This ensures we maximize the total units carried within the truck's capacity.
Sort: Sort the boxTypes
array in descending order based on numberOfUnitsPerBoxᵢ
. This ensures that we consider the most valuable boxes first. Various sorting algorithms can be used (e.g., merge sort, quicksort), with time complexity typically O(n log n), where n is the number of box types.
Iterate and Load: Iterate through the sorted boxTypes
. For each box type, determine how many boxes of that type can be loaded without exceeding truckSize
. Load the maximum possible number of boxes of that type and update truckSize
accordingly.
Calculate Total Units: Accumulate the total number of units loaded.
class Solution:
def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
boxTypes.sort(key=lambda x: x[1], reverse=True) # Sort by units per box in descending order
totalUnits = 0
remainingTruckSize = truckSize
for numBoxes, unitsPerBox in boxTypes:
loadableBoxes = min(numBoxes, remainingTruckSize) # Load as many boxes as possible
totalUnits += loadableBoxes * unitsPerBox
remainingTruckSize -= loadableBoxes
if remainingTruckSize == 0: # Truck is full; no need to continue
break
return totalUnits
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public int maximumUnits(int[][] boxTypes, int truckSize) {
Arrays.sort(boxTypes, (a, b) -> b[1] - a[1]); // Sort by units per box in descending order
int totalUnits = 0;
int remainingTruckSize = truckSize;
for (int[] boxType : boxTypes) {
int loadableBoxes = Math.min(boxType[0], remainingTruckSize);
totalUnits += loadableBoxes * boxType[1];
remainingTruckSize -= loadableBoxes;
if (remainingTruckSize == 0) {
break;
}
}
return totalUnits;
}
}
Similar implementations can be created in other languages (C++, Javascript, Go, etc.) following the same algorithm. The core logic remains consistent across languages: sort by units per box, iterate, load boxes greedily, and accumulate units.