【LeetCode】1691. 堆叠长方体的最大高度
创始人
2024-04-20 12:39:30
0

题目描述

给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。
如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。
返回 堆叠长方体 cuboids 可以得到的 最大高度 。

示例 1:

在这里插入图片描述
输入:cuboids = [[50,45,20],[95,37,53],[45,23,12]]
输出:190
解释:
第 1 个长方体放在底部,53x37 的一面朝下,高度为 95 。
第 0 个长方体放在中间,45x20 的一面朝下,高度为 50 。
第 2 个长方体放在上面,23x12 的一面朝下,高度为 45 。
总高度是 95 + 50 + 45 = 190 。

示例 2:

输入:cuboids = [[38,25,45],[76,35,3]]
输出:76
解释:
无法将任何长方体放在另一个上面。
选择第 1 个长方体然后旋转它,使 35x3 的一面朝下,其高度为 76 。

示例 3:

输入:cuboids = [[7,11,17],[7,17,11],[11,7,17],[11,17,7],[17,7,11],[17,11,7]]
输出:102
解释:
重新排列长方体后,可以看到所有长方体的尺寸都相同。
你可以把 11x7 的一面朝下,这样它们的高度就是 17 。
堆叠长方体的最大高度为 6 * 17 = 102 。

提示:

n == cuboids.length
1 <= n <= 100
1 <= widthi, lengthi, heighti <= 100

方法一:

思路:

  • 首先对每个长方体三个维度的长度进行排序,将最长的放置在最前面,那么 cuboids[i][0] 就会作为 高度 累加到最终结果;
  • 对每个长方体内部进行排序之后,对所有长方体进行升序排序,也就是说,后一个长方体才可能叠加在前一个长方体之上。
  • 完成排序工作后,开始遍历每一个长方体。使用 动态规划 的思想, dp[i] 指的是 前 i 个长方体的最大高度。
  • 因此,先令 dp[i] = cuboids[i][0],这对应了不堆叠的情况;
  • 之后,因此遍历当前 能够堆叠的长方体, 如果能够堆叠,则有 dp[i] = max(dp[i], dp[j] + cuboids[i][0]) 。
  • 最后, max_height = max(max_height, dp[i]) ,因为 dp[n-1] 很有可能不是高度最大的情况,所以在过程中要保存当前的最大高度。

情况

  • 通过;

收获

  • 今天终于用上了 动态规划 ,思路也比较顺利,但是出现了一些问题:
  • 对每个长方体内部排序的时候,对于 for(auto ) 忘记加上 & ,导致排序一直无法生效;
  • 对所有长方体排序的时候,由于每个长方体数组内还有三个元素,应该要另外写函数才能保证降序排序,这里偷懒了, 因此使用了默认的升序排序, 不过问题不大。
  • 动态规划 中情况的考虑不够充分,一开始想的是按顺序不断累加,但其实 i=2 和 i=4 也可以累加,因此还是需要双重循环。

时间复杂度:O(n2),其中 n 表示长方体的个数。时间复杂度主要取决于排序动态规划枚举,对每个长方体边的大小进行排序的总时间复杂度为 O(n),对长方体进行排序的时间为 O(n logn),对于每个长方体我们都需要枚举所有可以堆叠其上的长方体,需要的时间为O(n2),因此总的时间复杂度为 O(n2) 。
空间复杂度:O(n),其中 n 表示长方体的个数。排序需要的栈空间为 O(log n),存储每个长方体为底的最大高度需要的空间为 O(n),因此总的空间复杂度为 O(n)。

在这里插入图片描述

class Solution {
public:int maxHeight(vector>& cuboids) {// 对长方体的长宽高按大->小排序 cuboid[0]:heightfor(auto& cub : cuboids){sort(cub.begin(), cub.end(), greater());}// 对所有长方体排序,按照从小到大sort(cuboids.begin(), cuboids.end());int n = cuboids.size();int max_height = 0;vector dp(n);for(int i=0; idp[i] = cuboids[i][0];for(int j=0; j// 能堆叠if(cuboids[j][0] <= cuboids[i][0] && cuboids[j][1] <= cuboids[i][1] && cuboids[j][2] <= cuboids[i][2]){dp[i] = max(dp[i], dp[j] + cuboids[i][0]);}} max_height = max(max_height, dp[i]);}return max_height;}
};

相关内容

热门资讯

爱拼才会赢作文 爱拼才会赢作文(集合7篇)  在学习、工作、生活中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是...
参加运动会作文300字 参加运动会作文300字四篇  无论是身处学校还是步入社会,大家最不陌生的就是作文了吧,写作文可以锻炼...
我在变的作文400字 我在变的作文400字  作文【第1篇】  我上初中快一个月了,我发现成在变。  在学校的每一个人,都...
伤仲永的作文750字 伤仲永的作文750字  最近读了王安石的名篇《伤仲永》。这篇文章讲了一个故事:江西金溪县有个叫方仲永...
邻里和睦的作文 关于邻里和睦的作文范文  在日常学习、工作和生活中,许多人都写过作文吧,借助作文人们可以反映客观事物...
跳皮筋作文400字 跳皮筋作文400字  下午放学,我和思思走到了我家开的店门口,正要告别,思思突然说:“我们跳一下皮筋...
《斯梦索尼克传奇》简介 -作... 《斯梦索尼克传奇》简介 -作文作者:星洛 (安徽省安庆市人民路小学 劳毅凡) 《斯梦...
风雨中的美丽作文 风雨中的美丽作文(精选10篇)  在日常生活或是工作学习中,大家或多或少都会接触过作文吧,作文是人们...
我的新发现作文 我的新发现作文精选10篇  在平平淡淡的学习、工作、生活中,许多人都有过写作文的经历,对作文都不陌生...
风雨的磨炼作文 风雨的磨炼作文  人们常说现在的我们是祖国的花朵。但花儿也是各种各样的:有卑微的;有在恶劣的自然环境...
梦影450字作文 梦影450字作文  梦影 在那一刻,我仿佛看见整个世界崩溃在我的面前。废墟中那一片片的瓦砖都刻有鲜活...
星际旅途作文600字 星际旅途作文600字  在学习、工作乃至生活中,大家都尝试过写作文吧,作文是从内部言语向外部言语的过...
幸福优秀作文400字 幸福优秀作文400字(精选43篇)  无论在学习、工作或是生活中,大家都不可避免地会接触到作文吧,借...
老师作文400字 老师作文400字(通用30篇)  在学习、工作或生活中,大家都尝试过写作文吧,作文是人们把记忆中所存...
采蘑菇作文 采蘑菇作文10篇  在日常学习、工作和生活中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是人们把...
谁是最可爱的人作文 关于谁是最可爱的人作文(精选16篇)  无论在学习、工作或是生活中,大家都写过作文,肯定对各类作文都...
中国文化的作文 中国文化的作文(精选23篇)  在日常学习、工作或生活中,大家都接触过作文吧,通过作文可以把我们那些...
摔倒作文300字 摔倒作文300字(通用25篇)  在日常学习、工作抑或是生活中,大家总免不了要接触或使用作文吧,作文...
东湖的夜色作文 东湖的夜色作文  春姑娘悄悄的来到了人间,新的一年也即将到来。  晚风习习,夜幕降临。月朗星稀的夜晚...
粘土制作方法作文推荐45篇 粘土制作方法作文 第一篇同学们,你们从小到大一定玩过很多次彩泥吧?没错,我也一样。今天,我又玩了一回...