博客
关于我
力扣 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主从同步配置方法和原理
查看>>
mysql主从复制 master和slave配置的参数大全
查看>>
MySQL主从复制几个重要的启动选项
查看>>
MySQL主从复制及排错
查看>>
mysql主从复制及故障修复
查看>>
MySQL主从复制的原理和实践操作
查看>>
webpack loader配置全流程详解
查看>>
mysql主从复制,读写分离,半同步复制实现
查看>>
MySQL主从失败 错误Got fatal error 1236解决方法
查看>>
MySQL主从架构与读写分离实战
查看>>
MySQL主从篇:死磕主从复制中数据同步原理与优化
查看>>
mysql主从配置
查看>>
MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
查看>>
MySQL之CRUD
查看>>
MySQL之DML
查看>>
Mysql之IN 和 Exists 用法
查看>>
MYSQL之REPLACE INTO和INSERT … ON DUPLICATE KEY UPDATE用法
查看>>
MySQL之SQL语句优化步骤
查看>>