博客
关于我
力扣 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/

    你可能感兴趣的文章
    POJ 3041 Asteroids(二分匹配模板题)
    查看>>
    Qt笔记——标准文件对话框QFileDialog
    查看>>
    poj 3083 Children of the Candy Corn
    查看>>
    POJ 3083 Children of the Candy Corn 解题报告
    查看>>
    POJ 3253 Fence Repair C++ STL multiset 可解 (同51nod 1117 聪明的木匠)
    查看>>
    Qt笔记——控件总结
    查看>>
    poj 3262 Protecting the Flowers 贪心
    查看>>
    poj 3264(简单线段树)
    查看>>
    Qt笔记——布局管理三件套分割窗口、停靠窗口和堆栈窗口
    查看>>
    poj 3277 线段树
    查看>>
    POJ 3349 Snowflake Snow Snowflakes
    查看>>
    POJ 3411 DFS
    查看>>
    poj 3422 Kaka's Matrix Travels (费用流 + 拆点)
    查看>>
    Qt笔记——官方文档全局定义(二)Functions函数
    查看>>
    POJ 3468 A Simple Problem with Integers
    查看>>
    poj 3468 A Simple Problem with Integers 降维线段树
    查看>>
    poj 3468 A Simple Problem with Integers(线段树 插线问线)
    查看>>
    poj 3485 区间选点
    查看>>
    poj 3518 Prime Gap
    查看>>
    poj 3539 Elevator——同余类bfs
    查看>>