dfs解法
- 信封先进行排序,先按照x排序,再按照y排序
- 一个信封只有选与不选两种情况
- 选的前提是当前的信封的宽和高大于上一次选取的信封的宽和高,嵌套信封数量加一
- 不选的话,宽和高保持不变,嵌套数量保持不变
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*/
// 记录最大值
private int max = Integer.MIN_VALUE;
public int maxLetters(int[][] letters) {
// 排序,先按照x排序,再按照y排序
Arrays.sort(letters, (o1, o2) -> {
return o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0];
});
int len = letters.length;
if (len <= 1) {
return len;
}
dfs(letters, 0, len, Integer.MIN_VALUE, Integer.MIN_VALUE, 0);
return max;
}
/**
* dfs逐步选取信封
* @param letters : 信封数据
* @param depth: 目前下标值
* @param len:总长度
* @param currx:选取的上一个信封的宽x值
* @param curry:选取的上一个信封的高y值
* @param count:选取的信封数量
*/
public void dfs(int[][] letters, int depth, int len, int currx, int curry, int count) {
// 如果depth达到了len,那么就判断最大信封嵌套数量
if (depth == len) {
max = Math.max(count, max);
return;
}
if (depth > len) {
return;
}
// 当前的信封的宽和高
int x = letters[depth][0];
int y = letters[depth][1];
// 如果该信封可以包含上个信封
if (x > currx && y > curry) {
// 宽和高变为了这个信封,count加一
dfs(letters, depth + 1, len, x, y, count + 1);
}
// 不选该信封,还是之前的信封的宽和高,count不变
dfs(letters, depth + 1, len, currx, curry, count);
}
}