1. 程式人生 > 其它 >1709 - 卡車上的最大單元數 - 貪心 - 排序

1709 - 卡車上的最大單元數 - 貪心 - 排序

技術標籤: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

Related Topics
  • 排序
  • 貪心

題目剖析&資訊挖掘

此題使用貪心演算法,單元個數越大的先裝,注意總和是否超出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;
    }
};

本人碼農,希望通過自己的分享,讓大家更容易學懂計算機知識。

在這裡插入圖片描述