3.二维递增子序列:信封嵌套问题

信封嵌套问题(LeetCode 354题 难度:困难)

思路:转二维 为 一维 调用 上篇文章 解答

		先对宽度w进行升序排列,如果遇到w相同的情况,则按照高度H进行降序排列(因为宽度一样不可能套娃,比如5 和5 不能同时进 去),
		然后把所有的H 作为一个数组,在这个数组上进行 计算(LIS)

官方语言

**因为两个W相同的信封不能相互包含,W相同时将H逆序排序,则这些逆序H中至多只会有一个被选入递增子序列,保证了最终的信封序列不会出现W相同的情况
**

图有了,就像于求H那一列的LIS

下面看代码:

public int maxEnvelopes(int[][] envelopes) {  
    int n=envelopes.length;  
    Arrays.sort(envelopes, new Comparator<int[]>() {  
        @Override  
 		public int compare(int[] a, int[] b) {  
			//如果W相同,按照H进行逆序排列
            return a[0]==b[0]?b[1]-a[1]:a[0]-b[0];  
        }  
    });  
    //对高度数组寻找 LIS int[] height=new int[n];  
    for (int i = 0; i < n; i++) {  
        height[i]=envelopes[i][1];  
    }  
    return lengthOfLIS(height);  
}

总结:

这个苦困难的题目,难就难在排序,正确排序后,就转为了一维数组的 LIS(最长递增子序列)问题

posted @ 2021-07-05 23:12  宋佳强  阅读(62)  评论(0编辑  收藏  举报