LeetCode原题:

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

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

注意:不允许旋转信封。

示例 1:

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

输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/russian-doll-envelopes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


题目解析:

该题实质是将二维的最长递增子序列问题转换为一维的最长递增子序列问题(参考文献 《labuladong的算法小抄》 作者:付东来


C++代码

#include <iostream>
#include <vector>
#include <algorithm>using std::vector;int maxEnvelopes(vector<vector<int>>& envelopes);
bool comp(const vector<int>& a, const vector<int>& b);int main()
{vector<vector<int>> envelopes;int arr[][2] = { {5, 4}, {6, 4}, {6, 7}, {2, 3} };for (int *i : arr){vector<int> a;a.push_back(i[0]);a.push_back(i[1]);envelopes.push_back(a);}std::cout << maxEnvelopes(envelopes) << std::endl;system("pause");return 0;
}int maxEnvelopes(vector<vector<int>>& envelopes)   //将二维最长递增子序列转换成一维最长递增子序列
{sort(envelopes.begin(), envelopes.end(), comp);        //LIS算法(最长递增子序列)vector<int> dp(envelopes.size(), 1);        //dp记录以envelops[i][1]结尾的最长递增子序列的长度for (int i = 0; i < envelopes.size(); ++i){for (int j = 0; j < i; ++j){if (envelopes[i][1] > envelopes[j][1])      //找到前面结尾比envelops[i][1]小的子序列dp[i] = dp[i] > dp[j] + 1 ? dp[i] : dp[j] + 1;        //更新以envelops[i][1]结尾的最长递增子序列的长度}}int res = 0; for (int i = 0; i < dp.size(); ++i)       //查找最长子序列res = res > dp[i] ? res : dp[i];return res;
}bool comp(const vector<int>& a, const vector<int>& b)  //回调函数
{if (a[0] < b[0])            //先对宽度进行升序return true;else if (a[0] > b[0])return false;else                     //如果宽度相等,则按照高度h降序排序{if (a[1] > b[1])return true;elsereturn false;}
}

LeetCode网页代码

class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) //将二维最长递增子序列转换成一维最长递增子序列{sort(envelopes.begin(), envelopes.end(), comp);        //LIS算法(最长递增子序列)vector<int> dp(envelopes.size(), 1);        //dp记录以envelops[i][1]结尾的最长递增子序列的长度for (int i = 0; i < envelopes.size(); ++i){for (int j = 0; j < i; ++j){if (envelopes[i][1] > envelopes[j][1])      //找到前面结尾比envelops[i][1]小的子序列dp[i] = dp[i] > dp[j] + 1 ? dp[i] : dp[j] + 1;        //更新以envelops[i][1]结尾的最长递增子序列的长度}}int res = 0; for (int i = 0; i < dp.size(); ++i)       //查找最长子序列res = res > dp[i] ? res : dp[i];return res;}static bool comp(const vector<int>& a, const vector<int>& b)   //设置为静态成员函数{if (a[0] < b[0])         //先对宽度进行升序return true;else if (a[0] > b[0])return false;else                     //如果宽度相等,则按照高度h降序排序{if (a[1] > b[1])return true;elsereturn false;}}
};

注意点:

当使用<algorithm>头文件中的sort函数对vector容器进行排序时,由于普通成员函数的参数列表中有一个隐含的参数this,将导致sort函数内部调用回调函数comp()时产生形参与实参不匹配的情况,如果设置为静态成员函数,由于静态成员函数不含this指针,则不会产生形参与实参不匹配的情况。

参考文献:reference to non-static member function must be called_奋斗的程序猿的博客-CSDN博客

注:该题的C++解法根据《labuladong的算法小抄》第二章——信封嵌套问题中的JAVA解法改编而来,仅用于学习交流。

【LeetCode 354】俄罗斯套娃信封问题——C++解法相关推荐

  1. LeetCode - 354 俄罗斯套娃信封问题

    题目来源 354. 俄罗斯套娃信封问题 - 力扣(LeetCode) 题目描述 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的 ...

  2. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

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

  3. leetcode 354. 俄罗斯套娃信封问题(二维排序有关)

    题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...

  4. leetcode 354. 俄罗斯套娃信封问题(dp+二分)

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

  5. LeetCode 354 俄罗斯套娃信封问题

    给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另 ...

  6. 354. 俄罗斯套娃信封问题

    354. 俄罗斯套娃信封问题 题目 一.思路 二.代码 总结 题目 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. ...

  7. 354. 俄罗斯套娃信封问题(动态规划)

    354. 俄罗斯套娃信封问题 问题描述 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都 ...

  8. 354. 俄罗斯套娃信封问题(良心注释)

    问题描述 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就 ...

  9. 【动态规划-困难】354. 俄罗斯套娃信封问题

    [题目] 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就 ...

最新文章

  1. 【网摘】检测 iframe 是否加载完成
  2. 计算力即生产力,智算中心就是智慧时代的“发电厂” | MEET2021
  3. 5G NGC — AF 的 Service information
  4. ajax 传递参数中文乱码解决办法
  5. 算法工程师思维导图—数据结构与算法
  6. 月薪11万招数据工程师,看到要求我傻眼了!
  7. RTSP播放器开发过程中需要考虑哪些关键因素
  8. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
  9. 授人以渔:stm32资料查询技巧
  10. wordpress调用 php文件上传,wordpress上传的文件在哪
  11. Java 数据库连接
  12. 码农们:你属于哪一种极品程序员?
  13. [转]Java集合类: Set、List、Map、Queue使用场景梳理
  14. 百度之星作为座位调整java_百度之星程序设计大赛十周年算法合集20052014.PDF
  15. FOC——14.15.过流保护电路与单片机外围电路
  16. java 物联网 云计算_传智播客Java JavaEE+物联网云计算 就业班
  17. 机器人开发--NDC方案
  18. excel表格斜线_WORD圆角表格,如此惊艳
  19. 总结 | 人生如逆旅,我亦是行人
  20. Linux系统重装时保留重要分区

热门文章

  1. 生成函数(母函数)——目前最全的讲解
  2. 电子科大和四川大学计算机考研分数线,最新!川大、电子科大公布考研复试分数线...
  3. 微信小程序定位的问题
  4. Keras深度学习实战(36)——基于编码器-解码器的机器翻译模型
  5. JointJs 绘制有数据流动效果的link连线
  6. Go 语言中的 logger 和 zap 日志库
  7. [Excel使用之每个案例1篇博客]#01 怎么让数字下拉递增
  8. Xshell使用密钥 或密码 登录linux
  9. 分布式TDSQL的实践
  10. [UFUN函数] UG二次开发,设置渲染样式,例如带边着色、静态线框等