3.动态规划-二维递增子序列:信封嵌套问题
本文内容来自github:labuladong 的算法教程,学习完之后做的笔记,大家可以去github看一下写的非常好。
3.1 题目描述
给出一些信封,每个信封用宽度和高度的整数对形式(w,h)表示。当一个信封A的宽度和高度都比另一个信封B大的时候,则B就可以放进A里,请问最多能套几层?
比如输入envlopes = [[5,4],[6,4],[6,7],[2,3]],算法返回3,因为最多有3个信封能够套起来,他们是[2,3]=>[5,4]=>[6,7].
3.2 思路分析
先对宽度w进行升序排列,如果遇到w相同的情况,则按照高度h降序排列。之后把所有的h作为一个数组,在这个数组上计算出的LIS的长度就是答案。
因为两个w相同的信封不能相互包含,w相同时将h逆序排列,则这些逆序h中组多只会有一个入选递增子序列,保证了最终的信封中不会出现w相同的情况。
int maxEnvelopes(int[][] envelopes){
int n = envelopes.length();
Arrays.sort(envelopes,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
}
});
int[] height = new int[n];
for(int i=0;i<n;i++)
height[i] = envelopes[i][1];
return lengthOfLIS(height);
}
时间复杂度:O(nlogn).