题解 | #信封嵌套问题#

信封嵌套问题

http://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f

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);
    }
}
全部评论

相关推荐

北漂的牛马人:211佬,包进的,可能是系统问题
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-10 15:24
高考前一晚在OPPO手机上设置了早上5:30的闹钟,然而闹钟并未按时响起。直到妈妈做好早餐后,在6:27打开手机才发现闹钟未触发,“气得早上饭都没吃”。资本家你赢了
永不遗忘:我来解释一下 :Oppo 手机晚上两点会自动进行系统更新,这个系统更新会重置掉所有设置好的闹钟,而且他也不会告诉你,而且只有 Oppo 会这样,华为苹果小米三星都不会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务