当前位置: 首页 > news >正文

【每日一题Day67】LC1739放置盒子 | 找规律+贪心 二分查找

放置盒子【LC1739】

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

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

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

只能找找规律 求和肯定算不出来

找规律+贪心

  • 思路:

    • 首先贪心放置盒子使接触地面的盒子数量最小的情况下,放置更多的盒子
      • 局部最优:每次放置盒子优先放置在顶部,顶部不能放置再放在底部
      • 全局最优:接触地面的盒子数量最小的情况下,放置最多的盒子
    • 按照此种方式放置盒子的话,每层能够放置的盒子存在特殊规律:
      • i i i层最多可以增加 i i i个接触地面的盒子,能够增加的盒子个数为 i ∗ ( i + 1 ) 2 \frac{i*(i+1)}{2} 2i(i+1)
      • 底部每增加第 k k k个盒子时,一共可以增加的盒子数量为 k k k【底部+上方一共可以增加的】
    • 因此首先将前 i − 1 i-1 i1填满,然后求出还需要在底部放置 j j j个盒子,再可以填充 n n n个盒子
  • 实现

    • 首先使用 c u r cur cur表示第 i i i层最多可以增加多少个可放置的盒子,如果 n > c u r n>cur n>cur,那么 n n n递减 c u r cur cur,并且 c u r cur cur每次递增 i i i
    • 然后第需要在添加几个接触地面的盒子,才能够放置 n n n个盒子
    class Solution {
        public int minimumBoxes(int n) {
            int i = 1, cur = 1;
            while (cur < n){
                n -= cur;
                i++;
                cur += i;
            }
            int j = 1;
            while (n - j > 0 ){
                n -= j;
                j++;
            }
            return i * (i - 1) / 2 + j;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n 3 ) O(\sqrt[3] n) O(3n ),需要遍历每一层计算盒子数,层数 i i i n n n 的关系是 i = O ( n 3 ) i = O(\sqrt[3]{n}) i=O(3n )
      • 空间复杂度: O ( 1 ) O(1) O(1)

二分查找

  • 思路:使用二分查找法搜索需要放置至第 i i i层(前 i − 1 i-1 i1层铺满),还需要放置 j j j个盒子至地面才可以放置 n n n个盒子

    • 在第 i i i层放 j j j个放置地面的盒子,所增加的盒子总数为
      f ( j ) = j ∗ ( j + 1 ) 2 j ≤ i f(j)= \frac{j*(j+1)}{2}\\ j \le i f(j)=2j(j+1)ji

    • 放满前 i i i层的盒子总数为
      g ( i ) = ∑ n = 1 i f ( n ) = 1 2 ∑ n = 1 i ( n 2 + n ) = 1 2 ∑ n = 1 i [ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 + n ( n + 1 ) 2 ] = ∑ n = 1 i n ∗ ( n + 1 ) ∗ ( n + 2 ) 6 g(i) = \sum_{n=1} ^if(n)=\frac{1}{2}\sum_{n=1} ^i(n^2+n)\\ = \frac{1}{2}\sum_{n=1} ^i[\frac{n*(n+1)*(2n+1)}{6}+\frac{n(n+1)}{2}]\\ =\sum_{n=1} ^i\frac{n*(n+1)*(n+2)}{6} g(i)=n=1if(n)=21n=1i(n2+n)=21n=1i[6n(n+1)(2n+1)+2n(n+1)]=n=1i6n(n+1)(n+2)

    • 以上两个函数均具有单调性,因此可以使用二分查找进行查找

  • 实现

    class Solution {
        public int minimumBoxes(int n) {
            int i = 0, j = 0;
            int low = 1, high = Math.min(n, 100000);
            while (low < high) {
                int mid = (low + high) >> 1;
                long sum = (long) mid * (mid + 1) * (mid + 2) / 6;
                if (sum >= n) {
                    high = mid;
                } else {
                    low = mid + 1;
                }
            }
            i = low;
            n -= (long) (i - 1) * i * (i + 1) / 6;
            low = 1;
            high = i;
            while (low < high) {
                int mid = (low + high) >> 1;
                long sum = (long) mid * (mid + 1) / 2;
                if (sum >= n) {
                    high = mid;
                } else {
                    low = mid + 1;
                }
            }
            j = low;
            return (i - 1) * i / 2 + j;
        }
    }
    
    作者:力扣官方题解
    链接:https://leetcode.cn/problems/building-boxes/solutions/2030450/fang-zhi-he-zi-by-leetcode-solution-7ah2/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度
      • 时间复杂度: O ( l o g ( n ) ) O(log(n)) O(log(n))
      • 空间复杂度: O ( 1 ) O(1) O(1)

相关文章:

  • 【Linux】Linux项目自动化构建工具——make/Makefile
  • <Linux线程同步>——《Linux》
  • 【Array数组】面试前基础知识点深度记忆总结
  • 20221226编译Toybrick的TB-RK3588X开发板的Android12系统1-编译环境配置
  • 大话JMeter2|正确get参数传递和HTTP如何正确使用
  • 在Makefile中使用空格缩进的方法
  • 详解vue中vuex的用法
  • 利用Bat打开exe程序并传入值
  • 【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • 基于Xlinx的时序分析与约束(5)----衍生时钟约束
  • Python常见问题整理
  • Docker安装Zookeeper教程(超详细)
  • 【学习笔记12.25】动态规划入门
  • C语言用好写好头文件
  • Android单元测试 - 几个重要问题
  • axios 和 cookie 的那些事
  • Javascript 原型链
  • Redis 中的布隆过滤器
  • Vue ES6 Jade Scss Webpack Gulp
  • VuePress 静态网站生成
  • 彻底搞懂浏览器Event-loop
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 时间复杂度与空间复杂度分析
  • 转载:[译] 内容加速黑科技趣谈
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #HarmonyOS:基础语法
  • #Ubuntu(修改root信息)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (js)循环条件满足时终止循环
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)WCF的Binding模型
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (四)JPA - JQPL 实现增删改查
  • (一)appium-desktop定位元素原理
  • (转)大道至简,职场上做人做事做管理
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(一):@echo off
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net CF下精确的计时器
  • .NET Core 版本不支持的问题
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 简单实现MD5
  • .NET 设计模式初探
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @AutoConfigurationPackage的使用
  • @EnableWebMvc介绍和使用详细demo
  • @RestController注解的使用