Leetcode 354.俄罗斯套娃信封问题 2021.03.04

Leetcode 354.俄罗斯套娃信封问题 2021.03.04

三月 04, 2021

354.俄罗斯套娃信封问题

  • 难度:困难

给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

示例

示例1:

输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出: 3
解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

说明

不允许旋转信封。

思路

  • 动态规划
    1. 我们按信封的宽排序,若宽相等,我们按高进行排序。
    2. 我们从第二个信封开始,开始拿起
    3. 若拿起的信封能将其之前的信封装入,说明其之前的信封能装的信封它都能装。
    4. 拿起的信封能装信封数量=其装入的信封内的数量+1(它本身)
    5. 比较拿起的信封能装信封数量是否比旧值大,取较大值

思路流程

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//动态规划
int maxEnvelopes(vector<vector<int>>& envelopes) {
if(envelopes.empty()) return 0;
sort(envelopes.begin(),envelopes.end(),[](const vector<int> &v1,const vector<int> &v2){
return v1[0]<v2[0] || (v1[0] == v2[0] && v1[1]>v2[1]);
});

vector<int> res(envelopes.size(),1);
for(int i = 1;i<envelopes.size();i++){
for(int j = 0;j<i;j++){
if(envelopes[j][1]<envelopes[i][1])
res[i] = max(res[i],res[j]+1);
}
}

return *max_element(res.begin(),res.end());
}