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

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

为了解决这个问题,我们需要找到最多能有多少个信封组成一组“俄罗斯套娃”信封。每个信封可以放进另一个信封里,前提是另一个信封的宽度和高度都比它大。

方法思路

  • 排序信封:首先将信封按照宽度升序、高度降序排序。这样,当宽度相同的时候,高度大的信封排在前面,这样可以让高度尽可能小,从而为后面的递增留出空间。
  • 提取高度数组:从排序后的信封中提取高度数组。
  • 动态规划:使用动态规划来找高度数组中的最长递增子序列的长度。这个长度就是我们能组成的最大俄罗斯套娃信封的数量。
  • 解决代码

    class Solution:    def maxEnvelopes(self, envelopes: List[List[int]]) -> int:        # 按宽度升序排序,宽度相同则高度降序排序        envs = sorted(envelopes, key=lambda x: (x[0], -x[1]))        hs = [x[1] for x in envs]        n = len(hs)        if n == 0:            return 0        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)

    代码解释

  • 排序信封:使用sorted函数,按照宽度升序和高度降序排列。
  • 提取高度数组:从排序后的信封中提取高度,得到一个高度数组hs
  • 动态规划:初始化一个数组f,其中f[i]表示到第i个元素时,最长递增子序列的长度。通过双重循环遍历,更新f数组,使得每个元素的值等于前面所有比它小的元素的值加1,取最大的那个值。
  • 返回结果f数组中的最大值即为最多能组成的俄罗斯套娃信封的数量。
  • 转载地址:http://cscr.baihongyu.com/

    你可能感兴趣的文章
    Python Serial:如何使用 read 或 readline 函数一次读取多个字符
    查看>>
    Python set([]) 如何检查两个对象是否相等?一个对象需要定义哪些方法来自定义它?
    查看>>
    Python setup.py:数据文件无法复制目录:不存在或不是常规文件
    查看>>
    Python setuptools sdist:仅安装版本化文件
    查看>>
    Python Shell下使用matplotlib
    查看>>
    Python Slice How-to,我知道Python Slice,但我怎么才能使用内置的Slice对象呢?
    查看>>
    python socket分包发送数据
    查看>>
    python socket模块_Python socket模块实现TCP服务端客户端
    查看>>
    Python SOCKS5代理客户端HTTPS
    查看>>
    Python Soc网络分析:通过使用函数迭代列表来计算机会网络
    查看>>
    Python SQL和NoSQL数据库操作实战
    查看>>
    python stdout flush_sys.stdout.flush()方法的用法
    查看>>
    python string 运算
    查看>>
    Python str与bytes之间的转换
    查看>>
    Python subprocess ffmpeg
    查看>>
    python subprocess Permission denied Errno 13
    查看>>
    Python subprocess.call - 将变量添加到 subprocess.call
    查看>>
    Python Subprocess.Popen 从一个线程
    查看>>
    Python subprocess.Popen 作为 Windows 上的不同用户
    查看>>
    Python subprocess.Popen() 等待完成
    查看>>