1. 程式人生 > 實用技巧 >俄羅斯套娃

俄羅斯套娃

俄羅斯套娃信封問題

難度:困難
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式(w, h)出現。當另一個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另一個信封裡,如同俄羅斯套娃一樣。

請計算最多能有多少個信封能組成一組“俄羅斯套娃”信封(即可以把一個信封放到另一個信封裡面)。

說明:
不允許旋轉信封。

示例:

輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
輸出: 3 
解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/russian-doll-envelopes

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        sort(envelopes.begin(), envelopes.end(), [](vector<int>& v1, vector<int>& v2){
            return v1[0] == v2[0] ? v1[1] > v2[1] : v1[0] < v2[0];
        });
        vector<int> dp;
        for(auto iter : envelopes){
            auto p = lower_bound(dp.begin(), dp.end(), iter[1]);
            if(p == dp.end())
                dp.push_back(iter[1]);
            else
                *p = iter[1];
        }
        return dp.size();
    }
};


馬戲團人塔

難度:中等
有個馬戲團正在設計疊羅漢的表演節目,一個人要站在另一人的肩膀上。出於實際和美觀的考慮,在上面的人要比下面的人矮一點且輕一點。已知馬戲團每個人的身高和體重,請編寫程式碼計算疊羅漢最多能疊幾個人。

示例:

輸入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110]
輸出:6
解釋:從上往下數,疊羅漢最多能疊 6 層:(56,90), (60,95), (65,100), (68,110), (70,150), (75,190)

提示:
height.length == weight.length <= 10000

來源:力扣(LeetCode)
連結:

https://leetcode-cn.com/problems/circus-tower-lcci

class Solution {
public:
    int bestSeqAtIndex(vector<int>& height, vector<int>& weight) {
        vector<pair<int, int>> tmp;
        for(int i = 0; i < height.size(); i++)
            tmp.push_back(make_pair(height[i], weight[i]));
        sort(tmp.begin(), tmp.end(), [](pair<int, int>& p1, pair<int, int>& p2){
            return p1.first == p2.first ? p1.second > p2.second : p1.first < p2.first;
        });
        vector<int> dp;
        for(const auto& [h, w] : tmp){
            auto p = lower_bound(dp.begin(), dp.end(), w);
            if(p == dp.end())
                dp.push_back(w);
            else
                *p = w;
        }
        return dp.size();
    }
};


總結

這兩個題目都是一個套路,先對陣列進行排序,選定一個作為第一排序另一個作為第二排序,第一排序升序,對於相同的第一排序則對第二排序進行降序。
再這樣轉變以後問題就被轉換為在陣列中找最長遞增陣列。
對於兩個變數去排序,先按住一個變數,這點太關鍵了!!!