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

}
相关文章
|
2月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
289 3
|
5月前
|
人工智能 弹性计算 运维
阿里云邀请您参加 2025 中国 Serverless 用户调查
阿里云邀请您参加 2025 中国 Serverless 用户调查
|
缓存 JavaScript 前端开发
Vue.js框架在构建单页面应用中的最佳实践
Vue.js最佳实践包括组件化(如单一职责组件)、使用Vuex管理状态、axios处理异步请求、Vue Router进行路由、优化性能(keep-alive及懒加载)和选择UI库配合模块化样式。通过这些方法,开发者能构建高效、可维护的SPA。【6月更文挑战第25天】
377 1
|
SQL Oracle 关系型数据库
DBeaver,一款好用的开源数据库管理软件
DBeaver,一款好用的开源数据库管理软件
401 3
|
人工智能 搜索推荐 算法
掌握未来:探索人工智能在日常生活的实际应用
随着技术的迅猛发展,人工智能(AI)已不再是遥不可及的概念,而是深入到我们生活的各个层面。本文将探讨AI技术如何影响我们的工作、娱乐和社交活动,同时分析其带来的挑战和机遇。我们将通过具体案例,揭示AI在日常生活中的应用现状及其对未来生活方式的潜在改变。
496 29
|
12月前
|
监控 安全 Java
深入探索微服务架构中的服务治理
【10月更文挑战第10天】深入探索微服务架构中的服务治理
277 0
|
11月前
|
人工智能 运维 监控
智能运维在现代数据中心的应用与挑战
随着云计算和大数据技术的迅猛发展,现代数据中心的运维管理面临着前所未有的挑战。本文探讨了智能运维技术在数据中心中的应用,包括自动化监控、故障预测与诊断、资源优化等方面,并分析了当前面临的主要挑战,如数据安全、系统集成复杂性等。通过实际案例分析,展示了智能运维如何帮助数据中心提高效率、降低成本,并提出了未来发展趋势和建议。
|
JavaScript
vue npm install安装插件请求github过慢问题
vue npm install安装插件请求github过慢问题
172 0
|
消息中间件 存储 Kafka
kafka常见问题处理
kafka常见问题处理
259 1
|
API 网络安全 数据安全/隐私保护
SMTP邮件邮箱API发送邮件的方法和步骤
使用SMTP邮件邮箱API(如AokSend)发送邮件涉及6个步骤:获取SMTP服务器地址和端口,进行身份验证,构建邮件内容,连接到服务器,发送邮件及处理结果。例如,Gmail的SMTP服务器地址是smtp.gmail.com,端口587。此方法适用于程序化发送邮件,确保安全并支持大规模发信服务。