2019校招真题编程(十八)搭积木

这篇博客探讨了一道关于积木搭高的编程题,涉及最多能搭多少层积木的问题。通过对积木的宽度进行排序,转化为寻找最长非递减子序列的问题。博主介绍了两种解决方案,包括O(N^2)和O(nlogn)的时间复杂度算法,并解释了如何使用lower_bound和upper_bound进行二分查找,以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小明有一袋子长方形的积木,如果一个积木A的长和宽都不大于另外一个积木B的长和宽,则积木A可以搭在积木B的上面。好奇的小明特别想知道这一袋子积木最多可以搭多少层,你能帮他想想办法吗?
定义每一个长方形的长L和宽W都为正整数,并且1 <= W <= L <= INT_MAX, 袋子里面长方形的个数为N, 并且 1 <= N <= 1000000.
假如袋子里共有5个积木分别为 (2, 2), (2, 4), (3, 3), (2, 5), (4, 5), 则不难判断这些积木最多可以搭成4层, 因为(2, 2) < (2, 4) < (2, 5) < (4, 5)。

解题思路

先对宽排序

那么问题就转化成:寻找此时所有长的最长不递减子序列

1. 寻找最大非递减子集

1. O( N 2 N^2 N2)

对于长度为N的数组A[N] = {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],

L[n] = 1;那么L[j] = max(L[i]) + 1, where i < j && a[i] < a[j],

也就是i的范围是i到n。这样,想求aj结尾的最大递增子序列的长度,

我们就需要遍历j之前的所有位置i(0到j-1),找出a[i] < a[j],计算这些i中,能产生最大L[i]的i,之后就可以求出L[j]。

之后我对每一个A[N]中的元素都计算以他们各自结尾的最大递增子序列的长度,

这些长度的最大值,就是我们要求的问题——数组A的最大递增子序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值