LeetCode354、俄罗斯套娃信封问题

问题描述

https://leetcode-cn.com/problems/russian-doll-envelopes/
在这里插入图片描述

解法(动规问题一般处理)

class Solution {
    
    
    public int maxEnvelopes(int[][] envelopes) {
    
    

        //这道题很明显我们排序不会影响最终的结果。

        //如何我们能够按照信封的大小从小到大排序,我们就比较好找出最多嵌套的信封
        Arrays.sort(envelopes,new   Comparator<int[]>(){
    
    
                                public int compare(int[]a,int[]b){
    
    
                                    if(a[0]==b[0]){
    
    
                                        return b[1]-a[1];//高度上降序
                                    }else
                                        return a[0]-b[0]; //宽度上升序
                                }
           
        });//优先按照宽度升序,,然后宽度相同的,按照高度降序——————之所以使用降序,
        //因为这个时候,我们保证同宽的只会用到一次(在最长递增子序里面,dp[i]表示以i结尾的最长递增子序,
        //所以不可能用到两次,用到两次的情况只会出现在高度升序排序的情况。)

        //然后就变成了我们只需要在高度这个维度,去找最长递增子序

         int[] height = new int[envelopes.length];//获取其高度列表
        for(int i=0;i<envelopes.length;i++){
    
    
            height[i] = envelopes[i][1];
        }
       

        //然后寻找最长递增子序:
        return lengthOfLIS(height);

    }
//寻找最长递增子序
    public int lengthOfLIS(int[] nums) {
    
    
            if(nums==null) return 0;
            int []dp = new int[nums.length];
            //边界:
            Arrays.fill(dp,1);
            //递推:
            for(int i=0;i<nums.length;i++){
    
    
                for(int j=0;j<i;j++){
    
    
                    if(nums[i]>nums[j]){
    
    
                        dp[i] = Math.max(dp[i],dp[j]+1);
                    }
                }
            }

            //返回结果:
            int max = 0;
            for(int i=0;i<nums.length;i++){
    
    
                if(max<dp[i]){
    
    
                    max = dp[i];
                }
            }
            return max;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/114436031