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

    俄罗斯套娃信封问题

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

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

    说明:
    不允许旋转信封。

    示例:

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

    解题思路:本题需要先对数组进行排序,将他转化为一个最长上升子序列的问题,然后用求解最长上升子序列的方法来进行解决

    class Solution {
        public int maxEnvelopes(int[][] envelopes) {
            
            int n = envelopes.length;
            if(n == 0)
                return 0;
            
            //数组定义:dp[i]表示以i结尾的信封可以套娃的最大数量
            int dp[] = new int[n];
    		//初始化
            dp[0] = 1;
            int ans = 1;
            
            //对数组进行排序
            Arrays.sort(envelopes, (a, b) -> {
               if(a[0] == b[0])
                   return a[1] - b[1];
                
                return a[0] - b[0];
            });
            
            /**
            状态方程:dp[i] = max(dp[i], dp[j] + 1) (j < i)
            **/
            for(int i = 1; i < n; i++) {
                dp[i] = 1;
                for(int j = 0; j < i; j++) {
                    if(envelopes[j][0] < envelopes[i][0] && envelopes[j][1] < envelopes[i][1]) {
                        dp[i] = Math.max(dp[i], dp[j] + 1);
                    }
                }
                ans = Math.max(ans, dp[i]);
            }
            
            return ans;
        }
    }
    
  • 相关阅读:
    java Vamei快速教程02 方法和数据成员
    java Vamei快速教程01
    二叉树
    高效通信模型之
    高效通信模型之
    线程间通信与同步
    线程
    进程
    C++面试知识点总结
    windows下UDP服务器和客户端的实现
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14023410.html
Copyright © 2011-2022 走看看