[动态规划 | LIS | 二分] LeetCode 354. 俄罗斯套娃信封问题

LeetCode------354. 俄罗斯套娃信封问题 摘要 俄罗斯套娃信封问题要求在给定信封尺寸的二维数组中,找出最多能嵌套的信封数量。本文提出了一种基于贪心算法和二分查找的最优解法: 首先对信封进行特殊排序:宽度升序,同宽度时高度降序,确保宽度条件满足且避免同宽度信封互相嵌套。 使用tails数组维护递增高度序列的最小末尾值,通过二分查找确定每个信封的插入位置: 若高度大于当前所有末尾值,扩展序列长度 否则替换第一个不小于该高度的值,优化后续匹配可能 最终tails数组长度即为最大嵌套数。该方法将时间复杂度从O(n²)优化至O(nlogn),是解决此类问题的 阅读详情
354. 俄罗斯套娃信封问题

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。

示例 1:

输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

示例 2:

输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

提示:

1 <= envelopes.length <= 5000
envelopes[i].length == 2
1 <= wi, hi <= 10^4

对宽度升序排序,宽度相等时,对高度进行降序排序,然后利用dp(LIS)求解最多的信封个数

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        int n = envelopes.size(),res = 0;
        sort(envelopes.begin(),envelopes.end(),[](const auto& A,const auto& B){
            return A[0] < B[0] or A[0] == B[0] and A[1] > B[1];
        });
        vector<int> f(n,0);
        for(int i = 0; i < n; i++){
            f[i] = 1;
            for(int j = 0; j < i; j++){
                if(envelopes[j][1] < envelopes[i][1])
                    f[i] = max(f[i],f[j] + 1);
            }
            res = max(res,f[i]);
        }
        return res;
    }
};

二分优化求解

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        int n = envelopes.size(),res = 0;
        sort(envelopes.begin(),envelopes.end(),[](const auto& A,const auto& B){
            return A[0] < B[0] or A[0] == B[0] and A[1] > B[1];
        });
        vector<int> f;
        f.push_back(envelopes[0][1]);
        for(int i = 0; i < n; i++){
            if(f.back() < envelopes[i][1]) f.push_back(envelopes[i][1]);
            else{
                auto pos = lower_bound(f.begin(),f.end(),envelopes[i][1]) - f.begin();
                f[pos] = envelopes[i][1];
            }
        }
        return f.size();
    }
};
差分隐私(Differential Privacy) 差分隐私,拉普拉斯机制和高斯机制的证明 阅读详情

相关推荐

解决相同型号USB设备在Windows系统中重复枚举问题

本文详细解析了Windows系统中相同型号USB设备重复枚举问题的成因及解决方案。通过修改注册表、使用PsTools工具清除设备记录以及编程实现自动化处理等方法,有效解决设备识别混乱问题,特别适用于自动化测试和工业设备管理场景。

weixin_42561040的博客 565

354. 俄罗斯套娃信封问题(动态规划)

这个题目是一个套娃问题,首先我们应该对数组进行排序,因为相同尺寸的信封不能够嵌套,所以我们按照每个子数组的第一个元素升序排序,第二个元素降序排序,这样这个问题就转化成了以第二个元素为主的最长上升子序列问题,这个思路好是好,但是想到前面快速排序需要耗费nlog。如果envelopes[i]/[1]大于我们的f[i-1],那么f[i]=envelopes[i]/[1];当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。n,后面的那个动态规划又是n。......

qq_54127343的博客 789

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1035

每日算法系列【LeetCode 354】俄罗斯套娃信封问题

题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 说明: 不允许旋转信封。 示例1 ...

算法码上来 1000

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

GAN网络详解析

介绍目前常见的GAN网络,以及GAN网络的基本组成

wm199的博客 6504

算法爱好者——算法题:最小调整代价 ? 待解决

给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,写一个函数求调整代价之和最小是多少。注意事项: 你可以假设数组中每个整数都是正整数,且小于等于100。格式:输入依次输入一个整数数组 num 和一个数字target ,最后输出最小调整代价之和。样例输入num = [ 1,4,2,3 ] target = 1样例输出2

wjheha的博客 582

单片机设计具备断电记忆功能的计时器

本文介绍了如何设计一款具备断电记忆功能的计时器,利用单片机和EEPROM存储器实现了计时器值的保存和恢复。当然,在实际的设计中还需要考虑其他因素,如电源管理、时钟精度等,以确保计时器的正常运行和准确性。选择合适的单片机:在设计计时器时,我们需要选择一款具备存储功能的单片机,以便在断电后能够保存计时器的状态。可以优化显示方式,使用更加直观的界面来展示计时器的值;函数中,我们首先从 EEPROM 中读取计时器的初始值,然后在一个无限循环中每秒钟增加计时器的值,并将新的值写入 EEPROM 中。

RlDart的博客 1094

leetCode 俄罗斯套娃 maxEnvelopes

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 作为leetCode老菜来说,依然是老套路,上来啪的一下就是一套暴力运算,很快啊,就超时了。 用递归来遍历的话,算法没问题,但是数据一多肯定超时。 看了官方解答,.

mmmMMM12345的博客 396

C# 从数秒到毫秒:MySQL+Redis百万数据优化实战全解析

在处理百万级数据时,传统单体数据库常面临查询效率低下、数据库负载过高和用户体验差等问题。为解决这些性能瓶颈,可以采用MySQL分库分表、Redis缓存和异步统计的组合策略。 数据库分片:通过水平分表和分库实现,将单表数据分散到多个物理表或数据库实例中,降低单点负载。 Redis缓存:利用Redis缓存高频数据,减少数据库查询压力,提升响应速度。 异步统计:通过消息队列(如RabbitMQ)解耦统计任务,后台处理非实时任务,避免阻塞主流程。 这些优化策略能够显著提升系统性能,确保在高并发和大数据量场景下的稳定

墨夶的博客 852

LPDDR5电路设计的新功能

本文从硬件电路设计的角度,简述了LPDDR5 JEDEC标准中新增的功能。

一只豌豆象的博客 7147

【ACM】俄罗斯套娃信封问题

题目 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 注意:不允许旋转信封。 思路:动态规划 当前信封的宽度和高度均大于前面的信封,即可将前面的信封包住,则信封数加1。因此,我们首先按照宽度进行从小到大排序,之后再看

weixin_52427290的博客 310

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LeetCode 354. 俄罗斯套娃信封问题(Python、动态规划LIS、贪心+二分查找)

学习这一算法的思想,解决二维LIS问题,字节跳动原题,值得反复学习 题目描述 该问题为最长递增子序列的二维问题。 我们要找到最长的序列,且满足 seq[i+1] 中的元素大于 seq[i] 中的元素。 该问题是输入是按任意顺序排列的——我们不能直接套用标准的 LIS 算法,需要先对数据进行排序。我们如何对数据进行排序,以便我们的 LIS 算法总能找到最佳答案? 我们可以在这里找到最长递增子序列的解决方法。如果您不熟悉该算法,请先理解该算法,因为它是解决此问题的前提条件。 算法: 假设我们知道了信封套娃顺.

稚嫩的劢劢的博客 430

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

动态规划

动态规划总结最长上升子序列及其延伸LIS问题俄罗斯套娃信封问题(354) 最长上升子序列及其延伸 LIS问题 俄罗斯套娃信封问题(354) 题目描述: 分析:此题是排序+最长上升子序列问题的组合。在对信封按w进行排序后,我们可以找到h上最长递增子序列的长度。考虑[[1,3],[1,4],[1,5],[2,3]],如果我们直接对 h 进行 LIS 算法,我们将会得到 [3,4,5],显然这是错的,因为 w 相同的信封是不能够套娃的。为了解决这个问题。我们可以按** w** 进行升序排序,若 w 相同则按 h

l_s_2020的博客 788

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

leetcode354. 俄罗斯套娃信封问题(动态规划-java)

合法嵌套,是大的套小的,因此这个题就是最长递增子序列的一个变种.当于在二维平面中找一个最长递增的子序列,其长度就是最多能嵌套的信封个数。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输入:envelopes = [[1,1],[1,1],[1,1]]注意:不允许旋转信封。

SP_1024的博客 1341

【LeetCode: 354. 俄罗斯套娃信封问题 | 暴力递归=>记忆化搜索=>动态规划+二分】

【LeetCode: 354. 俄罗斯套娃信封问题 | 暴力递归=>记忆化搜索=>动态规划+二分】🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

Coder_ljw的博客 730

LeetCode 354. 俄罗斯套娃信封问题(最长递增子序列+二分)

LeetCode 354. 俄罗斯套娃信封问题(最长递增子序列+二分)

老顽固也可爱 1061

【重点】【DP】【耐心排序】354. 俄罗斯套娃信封问题

基本方法,必须掌握!

Allenlzcoder的博客 627

【重点】【DP】300.最长递增子序列

必须掌握,O(N^2) + O(N)

Allenlzcoder的博客 492

LeetCode 354:俄罗斯套娃信封问题(贪心算法)—— 题解

贪心算法——俄罗斯套娃信封问题

2601_96587588的博客 435

力扣354俄罗斯套娃信封问题

俄罗斯套娃信封问题要求计算最多能嵌套的信封数量,解题关键在于降维处理。首先将信封按宽度升序、同宽度时高度降序排序,转化为高度数组的最长严格递增子序列(LIS)问题。随后采用贪心+二分查找的高效解法,维护最小尾元素数组tails,通过二分定位更新策略实现O(nlogn)时间复杂度。该算法避免了同宽度信封的干扰,正确求解最大嵌套数,空间复杂度为O(n)。典型示例输入[[5,4],[6,7],[2,3]]经过处理后可得解3([2,3]→[5,4]→[6,7])。

2401_89332662的博客 958

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

LeetCode第354题俄罗斯套娃信封问题详解:该问题要求计算最多能嵌套的信封数量,可转化为最长递增子序列问题。文章提供了两种解法:1)排序+二分查找(O(nlogn)时间复杂度),先按宽度升序、高度降序排序,再对高度求最长递增子序列;2)动态规划(O(n²))。包含C#、Python、C++三种语言实现,对比了执行效率(C++最快32ms)。关键点在于正确处理宽度相同的情况,将二维问题转化为一维问题。适合有一定算法基础的程序员学习动态规划和二分查找的应用。

qq_40263592的博客 1148

【LeetCode】动态规划—354. 俄罗斯套娃信封问题(附完整Python/C++代码)

俄罗斯套娃信封问题 是一个二维优化问题,类似于经典的 最长递增子序列(LIS) 问题。给定若干个信封,每个信封具有两个维度:宽度 w 和高度 h。要求找出最多可以嵌套的信封个数。一个信封 A 可以嵌套到信封 B 中的条件是:A.w < B.w 且 A.h < B.h。 通过将问题从二维降到一维,并结合动态规划和二分查找的思想,我们可以有效地解决这个问题。本文将详细讲解这一思路,并提供 Python 和 C++ 的实现。

Albert_Lsk的博客 1612

Leetcode 354:俄罗斯套娃信封问题(超详细的解法!!!)

给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 说明: 不允许旋转信封。 示例: 输入: envelopes = [[5,4],[6,4],[6,7],[2,3]] 输出: 3 ...

coordinate的博客 7461

俄罗斯套娃信封问题力扣--354

本文探讨了信封嵌套问题的最优解法。该问题要求在给定信封尺寸后,找出最多能嵌套的信封数量。核心思路是将问题转化为最长递增子序列(LIS)问题:先按宽度升序、高度降序排序信封,然后对高度数组应用优化的LIS算法。通过扑克牌堆叠的类比,采用二分查找将时间复杂度从O(n²)优化到O(nlogn)。关键步骤包括:预处理排序确保宽度相同信封不会同时被选,再使用类似扑克牌堆叠的方法计算最长递增高度序列。该方法高效解决了信封嵌套的最大化问题。

2301_80113113的博客 545

[LeetCode 困难 动态规划+LIS问题]354. 俄罗斯套娃信封问题

题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 说明: 不允许旋转信封。 示例: 输入: envelopes = [[5,4],[6,4],[6,7],[2,3]] 输出: 3 解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

weixin_50088096的博客 2480
上一篇: [单调栈] LeetCode 739. 每日温度
下一篇: nowcoder 水图 (DFS)
心一QAQ
博客等级 码龄7年 23粉丝 122原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值