zoukankan      html  css  js  c++  java
  • leetcode 354. 俄罗斯套娃信封问题

    题目描述:

    给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

    请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

    说明:
    不允许旋转信封。

    示例:

    输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
    输出: 3
    解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

    解题思路:

    两种思路都需要先对信封进行排序,先按照w从小到大排序,对于w相等的情况,则按照h从小到大排。

    思路一:

    O(n^2)的复杂度,用c++可以通过,python无法通过。利用一个dp数组,其中dp[i]表示当前i信封为最大信封的多信封个数。利用两重循环。

    思路二:

    还是需要排序,但这里的排序,对于w相等的情况下,h的排序需要从大到小,这样才能够保证后续的替换过程。利用之前最长上升序列的思想求解。

    代码:

    思路一:

     1 class Solution {
     2 public:
     3     static bool cmp(vector<int> a, vector<int> b)
     4     {
     5         if(a[0]==b[0])
     6             return a[1]<b[1];
     7         return a[0]<b[0];
     8     }
     9     int maxEnvelopes(vector<vector<int>>& envelopes) {
    10         int n = envelopes.size();
    11         if(n==0)
    12             return 0;
    13         sort(envelopes.begin(), envelopes.end(), cmp);
    14         vector<int> dp(n, 1);
    15         int res = 0;
    16         for(int i=0; i<n; i++)
    17         {
    18             for(int j=0; j<i; j++)
    19             {
    20                 if(envelopes[i][1]>envelopes[j][1] && envelopes[i][0]>envelopes[j][0])
    21                 {
    22                     dp[i] = max(dp[i], dp[j]+1);
    23                 }
    24             }
    25             res = max(res, dp[i]);
    26         }
    27         return res;
    28     }
    29 };

    思路二:

     1 class Solution {
     2 public:
     3     static bool cmp(vector<int> a, vector<int> b)
     4     {
     5         if(a[0]==b[0])
     6             return a[1]>b[1];
     7         return a[0]<b[0];
     8     }
     9     int maxEnvelopes(vector<vector<int>>& envelopes) {
    10         int n = envelopes.size();
    11         if(n==0)
    12             return 0;
    13         sort(envelopes.begin(), envelopes.end(), cmp);
    14         vector<int> dp;
    15         for(int i=0; i<n; i++)
    16         {
    17             auto iter = lower_bound(dp.begin(), dp.end(), envelopes[i][1]);
    18             if(iter == dp.end())
    19             {
    20                 dp.push_back(envelopes[i][1]);
    21             }
    22             else
    23                 *iter = envelopes[i][1];
    24         }
    25         return dp.size();
    26     }
    27 };
  • 相关阅读:
    前端 JS,localStorage/sessionStorage、cookie 及 url 等实现前台数据共享、传输
    webpack 利用Code Splitting 分批打包、按需下载
    React项目之BrowserRouter路由方式之-------生产环境404问题
    React生产环境打包&&后台环境运行(有跨域+无跨域)
    React前台改用HashRouter并解决两个问题
    React路由基础
    React前台404组件页面+路由控制重定向
    react调用方法
    JavaScript 数组遍历方法的对比
    数据可视化相关库说明
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11449012.html
Copyright © 2011-2022 走看看