描述
给 nn 个信封的长度和宽度。如果信封 AA 的长和宽都小于信封 BB ,那么信封 AA 可以放到信封 BB 里,请求出信封最多可以嵌套多少层。
分析
- 用Arrays.sort给letters排序,因为是二维数组,所以不能直接排序,需要自己写比较器。
- Arrays.sor比较器在遇到两个letters[i][0]相等的情况时,需要把letters[i][1]大的排在前面,这样不会出现letters[i][0]相等的信封只会在最终结果中出现一次。
- 在letters[i][1]中统计最长递增子序列的个数,这样挑选出来的长和宽都是递增的,即最终结果。
- dp[i] 表示以letters[i][1]为结尾的最长递增子序列的个数。
- dp[i]的取值要遍历i之前的letters[i][1],当letters[j][1] < letters[i][1]时,更新dp[i]。
import java.util.*;
public class Solution {
public int maxLetters (int[][] letters) {
int n = letters.length;
if(n == 0){
return 0;
}
Arrays.sort(letters,new Comparator<int[]>(){
public int compare(int[] a, int[] b){
if(a[0] == b[0]){
return b[1] - a[1];
}
return a[0] - b[0];
}
});
int[] dp = new int[n];
int max = 0;
for(int i = 0; i < n; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(letters[j][1] < letters[i][1]){
dp[i] = Math.max(dp[i],dp[j] + 1);
}
}
max = Math.max(max,dp[i]);
}
return max;
}
}