题目描述
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封
输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]
题目解析
首先,我们把信封进行排序,排序的逻辑是,按照第一维从小到大进行排序,如果第一维相等,则按照第二维从大到小排序,这样我们根据第二位的高度求最长上升子序列的长度即可得出答案。
代码
// 把信封先按照 排序, 排完序之后
// 第一维 从小到大
// 如果第一维相等 则第二维从大到小进行排序
// 然后按照高度找 最长上升子序列的长度
sort(envelopes.begin(),envelopes.end(),[](vector<int>a, vector<int>b){
if(a[0] == b[0]){
return a[1] > b[1];
}else{
return a[0]<b[0];
}
});
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
// 把信封先按照 排序, 排完序之后
// 第一维 从小到大
// 如果第一维相等 则第二维从大到小进行排序
// 然后按照高度找 最长上升子序列的长度
sort(envelopes.begin(),envelopes.end(),[](vector<int>a, vector<int>b){
if(a[0] == b[0]){
return a[1] > b[1];
}else{
return a[0]<b[0];
}
});
vector<int> height;
// height.push_back(envelopes[0][1]);
for(auto& e:envelopes){
height.push_back(e[1]);
}
// 在 height 上 找最长上升子序列的长度
// dp[i] 代表以 i 结尾的最长上升子序列的长度
int n = height.size();
vector<int> dp(n,0);
int res = 1;
for(int i=0;i<n;++i){
dp[i] = 1;
for(int j=0;j<i;++j){
if(height[i] > height[j]){
dp[i] = max(dp[i],1+dp[j]);
res = max(res,dp[i]);
}
}
}
return res;
}
};
提交 通过
希望有改进想法的小伙伴多多交流!!!