题目来源

354. 俄罗斯套娃信封问题 - 力扣(LeetCode)

题目描述

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

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

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

注意:不允许旋转信封。

示例

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

提示

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

题目解析

本题要求信封套信封,且外部的信封的宽、高必须都大于内部的信封的宽、高,问最多能套几个。

首先,我们很容易想到,将所有信封按照宽度升序,这样就可以保证只看宽度的话,排序靠前的信封可以被排序靠后的信封套进去。

真的是这样吗?

如果有两个宽度相同的信封,那么它们就无法嵌套。

因此,我们需要排除掉宽度相同的情况。

一种方案是dfs,比如宽度有 [1,2,3,3,4,5,5,5]

则宽度上一共有:2*3=6种嵌套方案,即不看宽度唯一的,那么只剩下[3,3,5,5,5],而重复的宽度的高度可能不同,因此这里需要求包含重复情况组合。

但是这种方案非常麻烦,也浪费性能。

有一种更好的方案,那就是宽度重复的情况不用管,我们只需要将宽度相同的信封的高度从大到小排序即可。

原因是,信封嵌套,不经要求宽度内小外大,高度也要求内小外大,因此如果两个信封宽度相同,而它们的高度降序的话,则排序靠后的信封也无法套进前面的信封。

因此,我们首先需要将,信封按照宽度升序,对于宽度相同的信封,则按照高度降序。

那么宽度一维就搞定,接下来就是求高度一维的最长递增子序列了,而关于最长递增子序列的求解请看这个博客

LeetCode - 300 最长递增子序列_伏城之外的博客-CSDN博客

这个博客种提供了三种方案:
1、动态规划

2、耐心排序 + 顺序查找

3、耐心排序 + 二分查找

其中耐心排序 + 二分查找是时间复杂度最低的,为O(nlgn)

算法源码

/*** @param {number[][]} envelopes* @return {number}*/
var maxEnvelopes = function (envelopes) {const heights = envelopes.sort((a, b) => (a[0] === b[0] ? b[1] - a[1] : a[0] - b[0])).map((envelope) => envelope[1]);return getMaxLenLIS(heights);
};function getMaxLenLIS(nums) {const dp = [nums[0]];for (let i = 1; i < nums.length; i++) {if (nums[i] > dp[dp.length - 1]) {dp.push(nums[i]);continue;}if (nums[i] < dp[0]) {dp[0] = nums[i];continue;}const idx = binarySearch(dp, nums[i]);if (idx < 0) dp[-idx - 1] = nums[i];}return dp.length;
}function binarySearch(arr, key, from = 0, to = arr.length) {let high = to - 1;let low = from;while (low <= high) {let mid = (high + low) >>> 1;let midVal = arr[mid];if (key < midVal) {high = mid - 1;} else if (key > midVal) {low = mid + 1;} else {return mid;}}return -(low + 1);
}

LeetCode - 354 俄罗斯套娃信封问题相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 智源重大研究方向:机器学习学术报告会(暨学者候选人发布)
  2. 稳压二级管原理之详解
  3. 苦逼网管员----何时能翻身!
  4. 给服务器装系统U盘要处理吗,服务器装系统从u盘装
  5. vba 邮件body html,Excel VBA中的Outlook电子邮件和签名 – .Body vs .HTMLbody
  6. C++实现简单选择排序
  7. IBASE search
  8. 数据库MySQL/mariadb知识点——日志记录(2)二进制日志
  9. oracle数据库时分秒格式_Oracle如何输出指定格式的日期时间数据呢?
  10. python dll 混合_Python | 条线混合图
  11. arrayfun用法
  12. 为什么看别人的网站排名都在第一页?有可能是以下三种原因
  13. 一个根据SortOrder控制排序的存储过程
  14. 卓有成效的管理者的五个习惯
  15. 在CentOS下面编译WizNote Qt Project
  16. proteus 安装包以及破解汉化
  17. 美容院加盟十大品牌到底怎么选
  18. 北京熊通科技 招聘FPGA研发工程师
  19. pagehelper插件显示total为-1或1
  20. 太极图php代码,css画太极图(阴阳八卦)

热门文章

  1. Python项目-随机加减法计算题
  2. python与sas_python与R(对比SAS),我该选择哪种工具?
  3. webp文件怎么改成jpg?
  4. 信息技术用计算机写字的教案,黔教版信息技术三年级下册第9课《用计算机写字》教案1.doc...
  5. 轻松开发北斗短报文设备(基于RDSS协议)
  6. 前端设计师常用的一些基础工具素材合集
  7. 简:繁体转为简体 20140712
  8. AI换脸(支持视频换脸,支持cpu、低算力)【附代码】
  9. 上万中不同风格的ppt模板免费下载
  10. Java 编程高手(附盘) 译作者: 博彦科技