俄羅斯套娃
阿新 • • 發佈:2020-11-25
俄羅斯套娃信封問題
難度:困難
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式(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();
}
};
總結
這兩個題目都是一個套路,先對陣列進行排序,選定一個作為第一排序另一個作為第二排序,第一排序升序,對於相同的第一排序則對第二排序進行降序。
再這樣轉變以後問題就被轉換為在陣列中找最長遞增陣列。
對於兩個變數去排序,先按住一個變數,這點太關鍵了!!!