题解 | #信封嵌套问题#
信封嵌套问题
http://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f
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); } }