俄罗斯套娃信封问题

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

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

说明:

不允许旋转信封。

示例:

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

代码:

46%98%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
public int maxEnvelopes(int[][] envelopes) {
if (envelopes==null||envelopes.length == 0) {
return 0;
}
//int count=0;
//Arrays.sort(envelopes, (a, b) -> ((a[0] - b[0])*10000+a[1]-b[1]));
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];
}
}
});
//int max=0;
int[] nums=new int[envelopes.length];
for(int i=0;i<envelopes.length;i++)
{
nums[i]=envelopes[i][1];
}
return lengthOfLIS(nums);
}
public int lengthOfLIS(int[] nums) {
if(nums==null||nums.length==0)return 0;
int[] m=new int[nums.length];
int max=0;

for(int i=0;i<nums.length;i++)
{
//int temp=nums[i];
int min=-1;
//int Lmax=0;
for(int j=i-1;j>=0;j--)
{
if(nums[j]<nums[i]){
if(m[j]>min)min=m[j];
if(min==max)break;
//break;
//min=1;
}
}
m[i]=min==-1?1:min+1;
if(m[i]>max)max=m[i];
}
return max;
}
}