dfs解法

  1. 信封先进行排序,先按照x排序,再按照y排序
  2. 一个信封只有选与不选两种情况
  3. 选的前提是当前的信封的宽和高大于上一次选取的信封的宽和高,嵌套信封数量加一
  4. 不选的话,宽和高保持不变,嵌套数量保持不变
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);
    }
}