博客
关于我
力扣 354. 俄罗斯套娃信封问题
阅读量:359 次
发布时间:2019-03-04

本文共 1157 字,大约阅读时间需要 3 分钟。

题目描述

给你一个二维整数数组 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 <= 5000
  • envelopes[i].length == 2
  • 1 <= wi, hi <= 10^4

来源:力扣(LeetCode)

链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


动态规划

按照第一维升序、第二维降序排序,再对第二维求 LIS 结果即可。关于如何求 LIS 的长度,可以参考。

仅对第一维升序,如果输入为 [[1, 1], [1, 2], [1, 3]],此时如果单单考虑第二维,发现 LIS 长度为 3。但实际上由于第一维都一样,所以只能组成长度为 1LIS。但是如果在排序的时候,对第二维降序排序,则得到 [[1, 3], [1, 2], [1, 1]],此时只考虑第二维,则可以得到正确结果。

class Solution:    def maxEnvelopes(self, envelopes: List[List[int]]) -> int:        envs = sorted(envelopes, key=lambda x: (x[0], -x[1]))        hs = [*map(lambda x: x[1], envs)]        n  = len(hs)        f = [1] * n        for i in range(n):            for j in range(i):                if hs[i] > hs[j]:                    f[i] = max(f[i], f[j] + 1)        return max(f)

运行结果

执行结果:通过

执行用时:7308 ms, 在所有 Python3 提交中击败了51.55% 的用户
内存消耗:16.4 MB, 在所有 Python3 提交中击败了43.44% 的用户


2021.4.4

你可能感兴趣的文章
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>
MySQL 命令和内置函数
查看>>
mysql 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 备份 Xtrabackup
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>