354. 俄罗斯套娃信封问题

给你一个二维整数数组 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

提示:

1 <= envelopes.length <= 1e5
envelopes[i].length == 2
1 <= wi, hi <=1e5

解析:

  • 可以根据第一维从小到大,第二维从大到小排序(记为x,y)(不用特殊判断一维相等情况,(1,2)(1,3)(1,4))
  • 遍历每个元素,能套进去的一定在该元素之前,利用动态规划找符合条件的最大信封数时间复杂度为O(N*2)
  • 可以利用二分降低复杂度 f[j]表示信封个数为j的最大元素值,显然f[j+1]>f[j],f为单调递增的数组。如果当前envelopes[i][1]>f.back();说明该信封可以将最大信封装入f[j+1]=envelopes[i][1]
  • f的长度就是信封最大数。

代码:

bool cmp(const vector<int>& l,const vector<int>& r){if(l[0]==r[0])return l[1]>r[1];else    return l[0]<r[0];
}
class Solution {public:// 二维问题,一维一维解决int maxEnvelopes(vector<vector<int>>& envelopes) {if(envelopes.size()==0)return 0;sort(envelopes.begin(),envelopes.end(),cmp);int n=envelopes.size();vector<int> f;f.push_back(envelopes[0][1]);for(int i=1;i<n;i++){int a = envelopes[i][1];// 如果当前值大于(j个信封最大值,说明当前更大)if(a>f.back())f.push_back(a);// 更新it所在位置信封数对应的最大值else{auto it=lower_bound(f.begin(),f.end(),a);*it=a;}}return f.size();}
};

354. 俄罗斯套娃信封问题--(每日一难phase2--day9)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 力扣354——俄罗斯套娃信封问题(排序+动态规划)

    思路 首先排序,后面一定不会存在比当前信封更大的信封. 对于严格大于,是具有传递性的,如果信封a比信封b大,则a比(所有b大于的信封)大,因此可以利用传递性进行动态规划. dp代表该信封能装下的最大数 ...

最新文章

  1. 从头到尾使用Geth的说明-3-geth参数说明和环境配置
  2. 3行代码就能可视化Transformer的奥义 | 开源
  3. python可以调试吗_调试-有什么好的方法可以使我的Python代码首次运行?
  4. 【玩转cocos2d-x之三十二】xml的解析
  5. python匿名函数lambda_python的匿名函数lambda解释及用法
  6. 终于,我读懂了所有Java集合——map篇
  7. 笔记本windows7设置WIFI教程(超详细)
  8. Python 学习过程问题记录
  9. SHN-PEG2000-Pyrene,Pyrene-PEG2000-NHS
  10. 矩阵论(零):线性代数基础知识整理(1)——逆矩阵、(广义)初等变换、满秩分解
  11. git常用命令及常见问题
  12. MAC 活动监视器部分状态缺失
  13. Web-HTML+CSS入门笔记
  14. 微信小程序java中文乱码_如何解决微信小程序显示中文无法上传或者出现乱码的问题?...
  15. Retrofit中如何正确的使用https?
  16. 超大跨度桥梁建设如何突破特异风致灾风险的困局?
  17. MES制造执行系统概述连载(一)
  18. Even Loop(事件循环机制)
  19. osgEarth加载谷歌卫星地图的源码案例
  20. 微信H5棋牌类及app类推广链接在微信推广中遇到的问题讨论

热门文章

  1. bat: 调用WinRAR.exe压缩文件
  2. 《穿越计算机的迷雾》读书笔记五
  3. WEB前端开发练习代码
  4. html 重复执行函数,javascript延时重复执行函数 lLoopRun.js
  5. 'Data_Label_Tools - 开源数据标注工具大列表
  6. dw中html颜色的设置颜色代码,利用Dreamweaver(DW)快速输入CSS颜色代码值
  7. snmp trap 如何在浏览器中_SNMP TRAP功能
  8. 免费的科研论文画图软件drawio以及Mermaid
  9. CADD课程学习(12)-- 基于碎片的药物设计(MOE)
  10. python图像处理(十一)——图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子、Laplacian算子