俄罗斯套娃信封问题
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (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; } 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[] 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 min=-1; for(int j=i-1;j>=0;j--) { if(nums[j]<nums[i]){ if(m[j]>min)min=m[j]; if(min==max)break; } } m[i]=min==-1?1:min+1; if(m[i]>max)max=m[i]; } return max; } }
|