354. 俄罗斯套娃信封问题

简介: 354. 俄罗斯套娃信封问题

题目

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/russian-doll-envelopes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。`

解题思路

在这里插入图片描述

排序:长度由小到大,长度一样的时候高度由大到小
在这里插入图片描述
得到一个数组:5326462
结论,这个数组中最长递增子序列长度就是套娃最多能套多少层
长度跟我一样的东西,高度不如我的,在我后面
那么只要左侧高度小于我,它长度必须小于我,我所形成的递增子序列必能套进去
我们排除了干扰项,为什么高度要由大到小排,就是为了防止高度比我小的,在我左边干扰我形成递增子序列

代码

class Solution {
    public class Envelope{
        public int l;
        public int h;
        public Envelope(int width,int height){
            this.l=width;
            this.h=height;
        }
    }
    public class envelopeComparator implements Comparator<Envelope>{
        public int compare(Envelope o1,Envelope o2){
            return o1.l!=o2.l?o1.l-o2.l:o2.h-o1.h;
        }
    }
    public int maxEnvelopes(int[][] envelopes) {
        int n=envelopes.length;
        Envelope[] env=new Envelope[n];
        for(int i=0;i<n;i++){
            env[i]=new Envelope(envelopes[i][0],envelopes[i][1]);
        }
        Arrays.sort(env,new envelopeComparator());
        int[] end=new int[n];
        end[0]=env[0].h;
        int right=0;
        int l=0;
        int r=0;
        int m=0;
        for(int i=1;i<n;i++){
            l=0;
            r=right;
            while(l<=r){
                m=l+(r-l)/2;
                if(env[i].h>end[m]){
                    l=m+1;
                }else{
                    r=m-1;
                }
            }
            right=Math.max(right,l);
            end[l]=env[i].h;
        }
        return right+1;
    }

}
相关文章
|
3月前
|
存储
力扣经典150题第三十九题:赎金信
力扣经典150题第三十九题:赎金信
20 0
|
9月前
|
机器学习/深度学习 算法 测试技术
C++二分查找算法的应用:俄罗斯套娃信封问题
C++二分查找算法的应用:俄罗斯套娃信封问题
|
供应链 物联网 数据安全/隐私保护
优衣库 UNIQLO,藏着多少秘密
优衣库 UNIQLO,藏着多少秘密
|
人工智能 算法 C++
每日算法系列【LeetCode 354】俄罗斯套娃信封问题
每日算法系列【LeetCode 354】俄罗斯套娃信封问题
|
算法 Java
【算法】缺失的第一个正数,俄罗斯套娃信封问题
1.缺失的第一个正数 2.俄罗斯套娃信封问题
104 10
|
算法 Java
. 赎金信(java算法)
. 赎金信(java算法)
60 0
. 赎金信(java算法)
|
算法
查找算法——抽签算法(假如我告诉你:不管多少元素,都只需要比对一次,你信还是不信?)
查找算法——抽签算法(假如我告诉你:不管多少元素,都只需要比对一次,你信还是不信?)
288 0
查找算法——抽签算法(假如我告诉你:不管多少元素,都只需要比对一次,你信还是不信?)
|
算法 前端开发 程序员
「LeetCode」383-赎金信⚡️
「LeetCode」383-赎金信⚡️
119 0
「LeetCode」383-赎金信⚡️
|
Java 程序员
工资条里藏着这些小秘密,第一个就有很多人不知道!
工资条里藏着的那些小秘密,更事关你的诸多权益!
1576 0