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;
    }

}
相关文章
|
9月前
|
Rust JavaScript 前端开发
我们都是调包侠
这篇内容讨论了从应用层到硬件层的编程工作,指出每个层次的程序员都是“调包侠”,即通过调用不同层次的接口来完成任务。应用层开发者使用高级语言控制设备,无需深入硬件细节。低级编程语言用于高性能需求,仍依赖操作系统。系统编程涉及硬件接口,需要了解硬件特性。硬件层面则涉及逻辑门电路设计与制造,需要考虑多种因素如性能、功耗和兼容性。文章强调各层次间的相互依赖,并提倡明确软件的局限性,选择细分方向,避免盲目跟风学习。
124 5
|
机器学习/深度学习 算法 测试技术
C++二分查找算法的应用:俄罗斯套娃信封问题
C++二分查找算法的应用:俄罗斯套娃信封问题
|
人工智能 算法 C++
每日算法系列【LeetCode 354】俄罗斯套娃信封问题
每日算法系列【LeetCode 354】俄罗斯套娃信封问题
|
安全 算法 网络安全
面试常问:HTTPS的加密过程 ----- 光明和黑暗的恩怨情仇
面试常问:HTTPS的加密过程 ----- 光明和黑暗的恩怨情仇
175 0
面试常问:HTTPS的加密过程 ----- 光明和黑暗的恩怨情仇
|
数据安全/隐私保护
听说这玩意可以防止否认 —— 数字签名
发送方发送消息的时候使用私钥对消息进行签名,接收方接收消息的时候使用公钥对签名进行验证即可确定发送者身份。因为签名只能由发送者的私钥完成,所以这个签名一定是由发送者签发的,这样就没有否认的问题了,这就是数字签名(Digital Signature)。