1. 程式人生 > 其它 >1564 把箱子放進倉庫裡 I

1564 把箱子放進倉庫裡 I

技術標籤:LeetCode

題目描述:
給定兩個正整數陣列 boxes 和 warehouse ,分別包含單位寬度的箱子的高度,以及倉庫中 n 個房間各自的高度。倉庫的房間分別從 0 到 n - 1 自左向右編號, warehouse[i] (索引從 0 開始)是第 i 個房間的高度。
箱子放進倉庫時遵循下列規則:
箱子不可疊放。
你可以重新調整箱子的順序。
箱子只能從左向右推進倉庫中。
如果倉庫中某房間的高度小於某箱子的高度,則這個箱子和之後的箱子都會停在這個房間的前面。
你最多可以在倉庫中放進多少個箱子?

示例 1:
在這裡插入圖片描述
輸入:boxes = [4,3,4,1], warehouse = [5,3,3,4,1]

輸出:3
解釋:
在這裡插入圖片描述
我們可以先把高度為 1 的箱子放入 4 號房間,然後再把高度為 3 的箱子放入 1 號、 2 號或 3 號房間,最後再把高度為 4 的箱子放入 0 號房間。
我們不可能把所有 4 個箱子全部放進倉庫裡。

示例 2:
在這裡插入圖片描述
輸入:boxes = [1,2,2,3,4], warehouse = [3,4,1,2]
輸出:3
解釋:
在這裡插入圖片描述
我們注意到,不可能把高度為 4 的箱子放入倉庫中,因為它不能通過高度為 3 的房間。
而且,對於最後兩個房間 2 號和 3 號來說,只有高度為 1 的箱子可以放進去。
我們最多可以放進 3 個箱子,如上圖所示。黃色的箱子也可以放入 2 號房間。
交換橙色和綠色箱子的位置,或是將這兩個箱子與紅色箱子交換位置,也是可以的。

示例 3:
輸入:boxes = [1,2,3], warehouse = [1,2,3,4]
輸出:1
解釋:由於第一個房間的高度為 1,我們只能放進高度為 1 的箱子。

示例 4:
輸入:boxes = [4,5,6], warehouse = [3,3,3,3,3]
輸出:0

提示:
n == warehouse.length
1 <= boxes.length, warehouse.length <= 10^5
1 <= boxes[i], warehouse[i] <= 10^9

方法1:
主要思路:解題連結彙總
(1)貪心;
(2)先對 箱子陣列進行升序排序;
(3)更新倉庫陣列,將每個陣列元素重新置為前面所有元素的最小值;

(4)對每個倉庫從後向前遍歷,匹配滿足要求的箱子;

class Solution {
public:
    int maxBoxesInWarehouse(vector<int>& boxes, vector<int>& warehouse) {
        sort(boxes.begin(),boxes.end());//升序排序
        int res=0;
        int min_v=warehouse[0];
        for(int&h:warehouse){//更新倉庫陣列,每個元素置為當前元素之前的所有元素中的最小值
            if(h<min_v){
                min_v=h;
            }
            else{
                h=min_v;
            }
        }
        int index=0;
        //從後向前遍歷倉庫,匹配各個滿足要求的箱子
        for(int i=warehouse.size()-1;i>=0;--i){
            if(boxes[index]<=warehouse[i]){
                ++index; 
                if(index==boxes.size()){//箱子全部匹配上了
                    return index;
                }
            }
        }
        return index;
    }
};