面试题 08.13:堆箱子

简介: 面试题 08.13:堆箱子

题目

题目链接

堆箱子。给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。

输入使用数组[wi, di, hi]表示每个箱子。

示例1:

输入:box = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
 输出:6

示例2:

输入:box = [[1, 1, 1], [2, 3, 4], [2, 6, 7], [3, 4, 5]]
 输出:10

解题

方法一:动态规划

参考链接

本题可以用到leetcode-300:最长递增子序列的方法,只需要稍加处理,就可以变成最长递增子序列的题目。

由于长宽高都要是底部大于上层的。因此只需要按照任意维度,从小到大排。那么箱子从高到低的 顺序就是那个排序结果的子序列。那么就是一个递增子序列的问题。

dp[i]表示,以索引为i的箱子为底的时候,最大的高度。

class Solution {
public:
    int pileBox(vector<vector<int>>& box) {
        int n=box.size();
        sort(box.begin(),box.end(),[](vector<int>&a,vector<int>&b){return a[0]<b[0];});
        vector<int> dp(n);
        int res=box[0][2];
        dp[0]=box[0][2];
        for(int i=1;i<n;i++){
            int maxH=0;//选第i个箱子前,满足条件,且最大的堆叠高度。
            for(int j=0;j<i;j++){
                if(box[i][0]>box[j][0]&&box[i][1]>box[j][1]&&box[i][2]>box[j][2]){
                    maxH=max(maxH,dp[j]);
                }
            }
            dp[i]=maxH+box[i][2];
            res=max(res,dp[i]);
        }
        return res;
    }
};


相关文章
|
2月前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
9月前
|
存储 Java 程序员
【面试题精讲】JVM-堆
【面试题精讲】JVM-堆
|
13天前
|
存储 算法
面试必知必会|理解堆和堆排序
面试必知必会|理解堆和堆排序
|
14天前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
2月前
|
存储 程序员 C++
面试题:C++堆和栈的区别?
面试题:C++堆和栈的区别?
31 0
|
9月前
【面试题精讲】JVM-堆-修改堆大小
【面试题精讲】JVM-堆-修改堆大小
|
11月前
|
Java 微服务
美团面试真题:jvm堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”
|
存储 缓存 算法
必知必会JVM三-面试必备,JVM堆内存详解
必知必会JVM三-面试必备,JVM堆内存详解
107 0
|
存储 程序员 编译器
|
存储
面试题:为什么不把基本数据类型放在堆中
面试题:为什么不把基本数据类型放在堆中
43 0