从我花时间上看,我是纠结排序很久。注意一下Comparator的写法,以后会了就好~
算法上讲,就是对envolope尺寸排序,然后对于排序后的每个信封,它可以装进的最多小信封数,是长宽都比它小的信封中装的进最多数目+1。和之前做的368. Largest Divisible Subset思路是一样的,甚至还要简单一点。
动规。
1 static class MySort implements Comparator<int[]> { 2 public int compare(int[] o1, int[] o2) { 3 for(int i = 0; i < o1.length; i++) { 4 if(o1[i] != o2[i]) { 5 return o1[i] - o2[i]; 6 } 7 } 8 return 0; 9 } 10 } 11 12 public int maxEnvelopes(int[][] envelopes) { 13 if(envelopes.length == 0 || envelopes[0].length == 0) { 14 return 0; 15 } 16 MySort mysort = new MySort(); 17 Arrays.sort(envelopes, mysort); 18 int len = envelopes.length; 19 int[] res = new int[len]; 20 int max = 1; 21 for(int i = 0; i < len; i++) { 22 res[i] = 1; 23 } 24 for(int i = 1; i < envelopes.length; i++) { 25 for(int j = i-1; j >= 0; j--) { 26 if(envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1]) { 27 res[i] = Math.max(res[j] + 1, res[i]); 28 max = Math.max(max, res[i]); 29 } 30 } 31 } 32 return max; 33 }
时间: 2024-10-14 09:55:44