博客
关于我
力扣 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:什么样的字段适合加索引?什么样的字段不适合加索引
查看>>
MySQL:判断逗号分隔的字符串中是否包含某个字符串
查看>>
MySQL:某个ip连接mysql失败次数过多,导致ip锁定
查看>>
MySQL:索引失效场景总结
查看>>
Mysql:避免重复的插入数据方法汇总
查看>>
MyS中的IF
查看>>
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
M×N 形状 numpy.ndarray 的滑动窗口
查看>>
m个苹果放入n个盘子问题
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
Nacos Client常用配置
查看>>
nacos config
查看>>
Nacos Config--服务配置
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>