美文网首页
LeetCode 第354题:俄罗斯套娃信封问题

LeetCode 第354题:俄罗斯套娃信封问题

作者: 放开那个BUG | 来源:发表于2020-11-22 11:48 被阅读0次

1、前言

image.png

2、思路

先对宽度w进行升序排序,如果遇到w相同的情况,则按照高度h降序排序。之后把所有的h作为一个数组,在这个数组上计算 LIS(最长递增子序列) 的长度就是答案。

w 生序可以理解,为啥要后面按照高度 h 降序呢?如果按照 h 生序,遇到这种:[[1, 1], [2, 2], [2, 3]] 之类的 case 肯定会算出是三个,但是它要求 w、h 都需要按照严格递增的方式才能放进去,所以 h 应该降序排列,即:[[1, 1], [2, 3], [2, 2]],就能避免这种情况。

3、代码

public class NO_354 {

    public int maxEnvelopes(int[][] envelopes) {
        int n = envelopes.length;

        // 宽度升序排序,宽度相同时,则按照高度降序排序
        Arrays.sort(envelopes, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];
            }
        });

        // 对高度数组完成 LIS
        int[] height = new int[n];
        for(int i = 0; i < n; i++){
            height[i] = envelopes[i][1];
        }

        return lengthOfLIS(height);
    }


    private int lengthOfLIS(int[] nums){
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1);
        for(int i = 0; i < nums.length; i++){
            for(int j = 0; j < i; j++){
                if(nums[j] < nums[i]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }

        int res = 0;
        for(int i = 0; i < dp.length; i++){
            res = Math.max(res, dp[i]);
        }

        return res;
    }

    public static void main(String[] args) {
        int[][] en = new int[][]{
                {5,4},{6,4}, {6,7}, {2, 3}
        };
        System.out.println(new NO_354().maxEnvelopes(en));
    }
}

相关文章

网友评论

      本文标题:LeetCode 第354题:俄罗斯套娃信封问题

      本文链接:https://www.haomeiwen.com/subject/bqjgyktx.html