1709 - 卡車上的最大單元數 - 貪心 - 排序
阿新 • • 發佈:2021-01-04
技術標籤:leetcode貪心演算法排序演算法leetcode資料結構
歡迎關注更多精彩
關注我,學習常用演算法與資料結構,一題多解,降維打擊。
文章目錄
題目描述
[1709] 卡車上的最大單元數
- https://leetcode-cn.com/problems/maximum-units-on-a-truck/
請你將一些箱子裝在 一輛卡車 上。給你一個二維陣列 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
- 排序
- 貪心
題目剖析&資訊挖掘
此題使用貪心演算法,單元個數越大的先裝,注意總和是否超出int32。
解題思路
方法一 貪心+排序
分析
在箱子個數一定的情況下,單元數越大的箱子先裝,使得最後總單元數最大。
思路
bool Cmp(vector<int> a, vector<int> b)
{
}
class Solution {
public:
int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
sort(boxTypes.begin(), boxTypes.end(), Cmp); // 按照單元數從大到小排序
int sum = 0, j=truckSize;
for (int i = 0; i < boxTypes.size() && j>0; ++i) {
// 儘量裝多的箱子進去
}
return sum;
}
};
注意
- 有可能最後卡車裝不下所有的箱子。
知識點
- 排序
- 貪心
複雜度
- 時間複雜度:O(nlog(n))
- 空間複雜度:O(n)
參考
程式碼實現
bool Cmp(vector<int> a, vector<int> b)
{
return a[1]> b[1];
}
class Solution {
public:
int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
sort(boxTypes.begin(), boxTypes.end(), Cmp); // 按單元數從大到小排序
int sum = 0, j=truckSize;
for (int i = 0; i < boxTypes.size() && j>0; ++i) {
if (boxTypes[i][0]<=j) { // 如果剩下卡車容量可以裝下當前規格的箱子。就全裝入
sum += boxTypes[i][0]*boxTypes[i][1];
j-=boxTypes[i][0];
} else { // 否則就只裝目前卡車容量的個數。
sum += j*boxTypes[i][1];
j=0;
}
}
return sum;
}
};
本人碼農,希望通過自己的分享,讓大家更容易學懂計算機知識。