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);
}