354. 俄罗斯套娃信封问题

在这里插入图片描述

class Solution {
  public int maxEnvelopes(int[][] envelopes) {
        if (envelopes.length == 0) {
            return 0;
        }

        int n = envelopes.length;
        Arrays.sort(envelopes, new Comparator<int[]>() {
            public int compare(int[] e1, int[] e2) {
                //如果信封一维不等,按一维从低到高排序
                if (e1[0] != e2[0]) {
                    return e1[0] - e2[0];
                } else {
                    //信封一维相等,按二维从高到低排序
                    return e2[1] - e1[1];
                }
            }
        });
          /**
         按照长度升序, 同长则宽度降序排列
        的最长递增子序列解法来做即可. 排序后等于把在二维(长、宽)
        上的最长递增子序列问题转换成一维(宽)上的最长递增子序列的查找, 因为对于
        长度来说已经满足递增, 只需要在宽度上也递增即为递增序列, 同长时按宽度降
        序排列的原因是避免同长时宽度小的也被列入递增序列中, 例如[3,3], [3,4]
        如果宽度也按升序来排列, [3,3]和[3,4]会形成递增序列, 而实际上不行.
        **/
        int[] f = new int[n];
        Arrays.fill(f, 1);
        int ans = 1;
        for (int i = 1; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (envelopes[j][1] < envelopes[i][1]) {
                    f[i] = Math.max(f[i], f[j] + 1);
                }
            }
            ans = Math.max(ans, f[i]);
        }
        return ans;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页