【LeetCode】1739. 放置盒子

news2025/1/21 2:53:08

1739. 放置盒子

题目描述

有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下:

你可以把盒子放在地板上的任何地方。
如果盒子 x 需要放置在盒子 y 的顶部,那么盒子 y 竖直的四个侧面都 必须 与另一个盒子或墙相邻。

给你一个整数 n ,返回接触地面的盒子的 最少 可能数量。


示例 1

输入:n = 3
输出:3
解释:上图是 3 个盒子的摆放位置。
这些盒子放在房间的一角,对应左侧位置。
在这里插入图片描述


示例 2

输入:n = 4
输出:3
解释:上图是 3 个盒子的摆放位置。
这些盒子放在房间的一角,对应左侧位置。
在这里插入图片描述


示例 3

输入:n = 10
输出:6
解释:上图是 10 个盒子的摆放位置。
这些盒子放在房间的一角,对应后方位置。
在这里插入图片描述


提示

1 <= n <= 109


算法一:找规律 + 数学思想(等差数列求和)

思路

  1. 为了方便画图找规律,我们将立体图转换为平面图来表示:
    在这里插入图片描述

  2. 根据贪心思想,接触地面的盒子构成的总体形状应该是一个左上三角,这样才可以使得内部的盒子垒起来的高度更高,以保证接触地面盒子数量最小的情况下容纳更多的盒子。我们画出前四层的盒子增长情况,来试探一下有什么规律存在:

    在这里插入图片描述

  3. 从上图不难发现,第 i 层最多可以增加 i 个接触地面的盒子。对于 第 i 层而言,此时总的接触地面的盒子数为:1+2+3+...+i = i*(i+1)/2

    第 i 层对应的上限为:1+2+3+...+i = i*(i+1)/2
    此时总的上限为:1+(1+2)+(1+2+3)+...+(1+2+3+...+i) = i*(i+1)*(i+2)/6

  4. 要放置 n 个盒子,需要完整地放满第 i 层(达到第 i 层的上限),剩余的盒子放在第 i+1 层。

  5. 我们先考虑第 i 层 (上限数):

    设 x 为满足 i*(i+1)*(i+2)/6 ≤ n 的最大 i,ans 代表总的接触地面的盒子数,max_n 代表总上限。

    由于 max_n + ans + i 的值等于 第 i+1 层上限数 -1 ,因此这个值可以作为循环结束的依据,可以确保当前层数 i 是最大值。

  6. 最后考虑剩余的盒子,此时已经放置的盒子数为第 i 层的上限,也就是max_n

    对于第 i+1 层, 如果接触地面的盒子增加 j 个,那么对应上限增加 1+2+...+j = j*(j+1)/2 。所以设 y 为满足 x(x+1)(x+2)/6 + j(j+1)/2 ≥ n 的最小 j。

  7. 最终答案就是 x(x+1)/2 + y

收获

  • 通过这道题发现,通过找规律和数学思想解题之后,代码会变得简洁很多,因此不要一味地用代码暴力求解。

算法情况

  • 时间复杂度:O(3√ n),通过计算可以发现,i 和 j 至多为 3√ n
  • 空间复杂度:O(1)

代码

class Solution {
public:
    int minimumBoxes(int n) {
        int ans = 0, max_n = 0;
        // max_n+ans+i:i+1层上限数-1
        // 能够保证此时i取到最大
        for (int i = 1; max_n+ans+i<= n; ++i) {
            ans += i;
            max_n += ans;
        }
        for (int j = 1; max_n < n; ++j) {
            ++ans;
            max_n += j;
        }
        return ans;
    }
};

参考资料:

  1. 官方题解
  2. 动画题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【webpack】cjs运行时分析

准备工作&#xff08;接上篇文章的示例也可以&#xff09;&#xff1a; 1. 在index.js文件中引入任一js文件 import sum from ./sum;const result sum(1,2); console.log(result);2. sum文件 const sum (a, b) > {return ab; }export default sum3. build.js文件 const…

离子交换法深度剖析

离子交换法 是一种借助于离子交换剂上的离子和污水中的离子进行交换反应而除去污水中有害离子的方法。 离子交换法的特点 离子交换过程是一种特殊的吸附过程&#xff0c;在许多方面与吸附过程类似。 与吸附法比较&#xff0c;其特点是:它主要吸附污水中的离子化物质&#xff…

怎样做一个不会被淘汰的车载诊断工程师

步入中年&#xff0c;不可避免会接触到所谓的中年危机&#xff0c;时刻在提醒自己提高自己的护城河&#xff0c;增强核心竞争力。但是这种事情也不是靠空想&#xff0c;还是要功夫下在平时。 自己是在2016年开始接触车载诊断方面&#xff0c;从事过诊断范畴的开发、测试、偏系…

程序员的圣诞节是怎么样的?

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 圣诞节&#xff0c;先在这里祝大家圣诞节快乐~~&#xff0c;用英语来表达就是 Merry Christmas ~~&#xff0c; 为了贴合这个氛围&#xff0c;今天分享种用 Python 绘制圣诞树的方法。 最近用代码绘画圣诞…

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具。 作为网络管理员或网络工程师&#xff0c;时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间&#xff0c;还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用…

SpringBoot+Vue项目医院体检中心管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

电脑文件数据恢复方法是什么?未备份电脑文件数据恢复的七种方法

在日常生活中&#xff0c;我们总会遇到这样或那样的事情&#xff0c;比如在使用电脑过程中出现文件数据丢失情况&#xff0c;那么在未备份文件下电脑文件数据丢失怎么恢复&#xff1f;电脑文件数据恢复方法有哪些&#xff1f;这里将根据不同情况分享不同的电脑文件数据恢复方法…

L05_课后练习_波士顿房价预测

波士顿房价预测 1.导入所需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import random from sklearn.model_selection import train_test_split2.读入数据 feature pd.read_csv("../data/boston.csv") feature…

Postgresql源码(95)优化器关键数据结构实例

1 测试数据 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into student values(4, st…

Linux的环境变量

目录 什么是环境变量&#xff1f; 那么如何添加自己的程序到命令行上&#xff0c;可以直接执行&#xff1f; 如何查看环境变量&#xff1f; 如何定义环境变量&#xff1f; C语言如何获取环境变量&#xff1f; 什么是环境变量&#xff1f; 在回答这个问题之前&#xff0c;可…

【Linux】之systemd与systemctl

文章目录一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.1 …

存档鉴未来,新时代电子档案长期保存之道

&#xff08;一&#xff09;电子档案单套制是未来档案管理的趋势 在政府和企业端&#xff0c;办公体系的信息化&#xff0c;电子档案的单套制实施&#xff0c;极大地提高了事务办理的效率&#xff0c;同时节约了大量纸质文件的使用成本。 在政务领域&#xff0c;单套制的推行…

Day840.原子类-Java 并发编程实战

原子类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于原子类。 一个累加器的例子&#xff0c;示例代码如下&#xff1a; 在这个例子中&#xff0c;add10K() 这个方法不是线程安全的&#xff0c;问题就出在变量 count 的可见性和 count1 的原子性上。 可见性问题…

Java7的异常处理新特性addSuppressed()方法

学习使用Java7新语法try-with-resources&#xff0c;在查看编译文件时&#xff0c;接触到addSuppressed()方法。记录一下使用方式。 先来看一段代码&#xff1a; private static void testt() {try (InputStream is CatchTest.class.getClassLoader().getResourceAsStream(&…

ThinkPHP 多应用模式初探

还是很久以前用tp3.0开发过项目&#xff0c;之后就再没使用过&#xff0c;现在tp都更新到6了&#xff0c;与之前差距很大&#xff0c;需要重新练习掌握最新的tp框架使用及特性。 目录 1.安装框架 2.安装多应用模式扩展think-multi-app 3.目录结构修改并创建应用子目录 4.应…

年后市场将反弹?服装人做好这些准备,才能赚到2023年第一桶金!

目前&#xff0c;随着防疫政策精准落地、逐步放开&#xff0c;人们对疫情的科学认知不断更新&#xff0c;市场活跃度正逐步恢复。秦丝通过与数万服装老板沟通交流&#xff0c;发现新的模式也在渐渐兴起&#xff0c;国内服装市场将有望迎来反弹。 1、消费氛围活跃&#xff0c;市…

善网ESG周报(第六期)

ESG报告&#xff1a; 宁夏建投城运首份社会责任&#xff08;ESG&#xff09;报告正式发布 12月20日&#xff0c;宁夏建投城市运营管理有限公司发布首份ESG报告。报告显示&#xff0c;其公司将业务与环境保护、社会责任、公司治理相结合打造一条绿色发展道路。 国寿股权投资发…

滚动条基本样式设置

::-webkit-scrollbar 系列属性 详细使用说明 ::-webkit-scrollbar注意&#xff1a;如果没有设置滚动溢出的相关属性&#xff0c;滚动条样式系列属性不会生效&#xff08;resize 除外&#xff09;。属性 ::-webkit-scrollbar 整个滚动条。::-webkit-scrollbar-button 滚动条上的…

Vue3组件化开发(一)

文章目录p11 组件组件的拆分和嵌套组件的CSS作用域组件的通信父子组件的通信父组件传递给子组件props的对象用法非prop的attribute子组件传递给父组件案例p11 组件 组件的拆分和嵌套 推荐安装的VS Cdoe插件 组件的CSS作用域 组件的通信 父子组件的通信 父组件传递给子组件…

模型初始化

在深度学习模型训练中&#xff0c;权重初始值极为重要&#xff0c;一个好的初始值会使得模型收敛速度提高&#xff0c;使模型准确率更准确&#xff0c;一般情况下&#xff0c;我们不使用全零初始值训练网络&#xff0c;为了利于训练和减少收敛时间&#xff0c;我们需要对模型进…