leetcode887. 鸡蛋掉落(动态规划-java)

news2024/11/19 0:46:46

鸡蛋掉落

  • leetcode887. 鸡蛋掉落
    • 题目描述
    • 暴力递归 + 二分查找
      • 代码演示
    • 动态规划
      • 代码演示
  • 动态规划专题

leetcode887. 鸡蛋掉落

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/super-egg-drop

题目描述

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。
已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。
每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?

示例 1:
输入:k = 1, n = 2
输出:2
解释:
鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
如果它没碎,那么肯定能得出 f = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。

示例 2:
输入:k = 2, n = 6
输出:3

示例 3:
输入:k = 3, n = 14
输出:4

提示:
1 <= k <= 100
1 <= n <= 10000

暴力递归 + 二分查找

这道题要用动态规划解,但题目本身很难直接推出动态规划的状态转移方程。
所以先用暴力递归尝试写出暴力版本。不过用缓存加二分查找优化后,效率还是可以的,

递归时,首先要考虑的就是递归过程中的变量,这题很容易发现变化的是鸡蛋的个数和楼层,选中一个楼层扔鸡蛋,没破的话呢就去上面楼层继续测试,(鸡蛋个数K 不变,楼层变成n - i):
process(n - i,k);
鸡蛋破了的话,要去下面楼层继续测试:鸡蛋个数减一,楼层减一
process(i - 1,k - 1).
用一个图演示,就容易看懂了:
在这里插入图片描述
我们先取每个楼层的最差情况,然后选取中所有楼层最差情况下的最好情况,就是需要最少的次数了。

然后再看下为什么可以进行二分查找,首先找到,要进行二分查找,必须要满足具有单调性,首先想这样一个问题,如果鸡蛋个数固定时,楼层越多,需要测试的次数就越多,因此这个递归具有单调性,
process(n - i,k); i 越大,值会越小,
process(i - 1,k - 1). i 越大值也会越大,
如图演示:
在这里插入图片描述
其实就是求交点。

代码演示

   public int superEggDrop(int k, int n) {
          int[][]dp = new int[n + 1][k + 1];
          return process(n,k,dp);
      
    }
   
	/**
	* 递归加 二分优化
	*/
     public static int process(int n,int k,int[][]dp){
        if(n == 0){
            return 0;
        }
        if(k == 1){
            return n;
        }
        //缓存
        if(dp[n][k] != 0){
            return dp[n][k];
        }
        int res = Integer.MAX_VALUE;
        int l = 1;
        int r = n;
        while(l <= r){
            int mid = (l + r) / 2;
            //没碎
            int p1 = process(n - mid,k,dp);
            //碎了
            int p2 = process(mid - 1,k - 1,dp);
            if(p2 > p1){
               r = mid - 1;
               res = Math.min(res,p2 + 1 ) ;
            }else{
                l = mid + 1;
                res = Math.min(res,p1 + 1);
            }
        }
        dp[n][k] = res;
        return res;
    }

动态规划

动态规划时,我们换一个思路去做。
就是我们知道鸡蛋个数和面对的楼层时,就知道最小的扔鸡蛋次数,我们最终要的答案就是dp(k,n).
现在我们修改下dp的含义,确定鸡蛋个数和最多允许的扔鸡蛋次数,就能确定楼的最高层数,具体就是:
dp[k][m] = n;
当前有k个鸡蛋,最多可以尝试扔m次。
比如dp[1][7] = 7
表示一个鸡蛋,最多扔七次,这个状态下楼层最高七层,
这样我们可以得出另外一个状态转移方程:
dp[k][m] = dp[k][m - 1] + dp[k - 1][m - 1] + 1;
如图演示:
在这里插入图片描述
dp[k][m - 1]就是上面的楼层数,因为鸡蛋没碎,才可以上去,鸡蛋个数不变,扔鸡蛋次数减一。
dp[k - 1][m - 1],就是楼下的层数,鸡蛋碎了去楼下,k -1,扔鸡蛋的次数 m - 1.
最后加1 ,加上本身楼层。
根据这个状态转移方程就可以写代码了。

代码演示

/**
* 动态规划
*/
  public int superEggDrop7(int k, int n) {
        int[][]dp = new int[k + 1][n + 1];
        int m = 0;
        //楼层 == n 时,退出,
        while(dp[k][m] < n){
            m++;
            for(int i = 1; i <= k;i++){
                dp[i][m] = dp[i][m - 1] + dp[i - 1][m - 1] + 1;
            }
        }
        //m 扔的次数。
        return m;
    }

动态规划专题

leetcode1884. 鸡蛋掉落-两枚鸡蛋

leetcode72. 编辑距离

leetcode1049. 最后一块石头的重量 II

leetcode312. 戳气球

leetcode63. 不同路径 II

leetcode62. 不同路径

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

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

相关文章

Python实现所有英雄皮肤图片采集,超高清

目录标题 前言环境使用:模块使用:代码基本四个步骤:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: Python 3.8 Pycharm 模块使用: requests —> 数据请求模块 需要安装 re 正则表达式 内置模块 不需要安装 os 文件操作模块 内置模块 不需…

记一次Weblogic控制台弱口令爆破事件应急响应

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 事件背景介绍02 流量分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中&#xff0c;安全部门在安全设备上观察到大量Weblogic控制台登录请求&#xff0c;现需根据流量情况…

Rancher集群搭建

前言 随着容器的普及和Kubernetes 的日渐成熟&#xff0c;企业内部运行多个Kubernetes 集群已变得颇为常见&#xff0c;然而部署kubernetes集群的方式也多样化&#xff0c;二进制部署、rancher、kubeadm、minikube等。然而本篇文章主要讲解的是如何使用rancher快速部署一个k8s集…

Linux:LAMP搭建(全源码包安装)

LAMP 就是 Linux Apache Mysql PHP/Python 目录 Linux安装 Apache安装 Mysql安装 安装PHP 安装PHP扩展包 编译安装PHP PHP 添加优化模块 测试网页协同工作 Linux安装 虚拟机安装 (1条消息) VMware&#xff1a;安装centos7_鲍海超-GNUBHCkalitarro的博客-CSD…

从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)

一、前言 doctest从字面意思上看&#xff0c;那就是文档测试。doctest是python里面自带的一个模块&#xff0c;它实际上是单元测试的一种。 官方解释&#xff1a;doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段&#xff0c;然后尝试执行并验证结果 doctest测试…

iostat命令详解

语法&#xff1a; iostat [ 选项 ] [<时间间隔> <次数> ] 支持的参数及参数详解&#xff1a; -c&#xff1a;仅显示CPU统计信息&#xff0c;与-d选项互斥 -d&#xff1a;仅显示磁盘统计信息&#xff0c;与-c选项互斥 -h&#xff1a;使用NFS&#x…

Prophet算法框架预测输出及使用方法

Prophet 时间序列预测框架入门实践笔记 接续上文&#xff0c;预测结果&#xff1a; forecast m.predict(future) forecast[[ds, yhat, yhat_lower, yhat_upper]].tail(48)forecast 是Pandas的DataFrame&#xff0c;数据项及含义如下&#xff1a; ‘ds’&#xff1a; 是日期时…

内容变现有了VVIP会员门槛,微博这么做图个啥?

文 | 螳螂观察 作者 | 易不二 充分竞争的存量时代&#xff0c;用户是最宝贵的平台资产。 这不仅体现在今年618期间&#xff0c;各大电商平台的“抢人大战”&#xff0c;更具体的风向还在于&#xff0c;作为移动互联网时代最有影响力的社交媒体之一&#xff0c;微博调整了新的…

网络安全——数据链路层安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.数据链路层安全协议简介 1.数据链路安全性 二.局域网数据链路层协议 1…

2023年亚马逊云科技中国峰会记录

前言 有幸抽到了亚马逊云科技中国峰会的门票&#xff0c;恰好又是在上海举行的&#xff0c;并且看预告有很多热点内容&#xff0c;所以就参加了。 27日一早就赶到了世博中心&#xff0c;此时已经排起了长队。 看来与会者还是蛮多的。 整体分为以下几个环节&#xff1a; 一.上…

津津乐道设计模式 - 外观模式详解(简化女友使用你的支付账户购物的支付体验)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

spark外置external shuffle service使用介绍

shuffle是什么 shuffle是Hadoop大数据计算中&#xff0c;一个必不可少的环节&#xff0c;通过shuffle可以将不同节点上的同类数据给移动到一起&#xff0c;这在分组&#xff0c;排序&#xff0c;聚合的场景中非常常见&#xff0c;简单图示如下&#xff1a; MapReduce数据处理模…

Vue.js中的状态管理:理解和使用Vuex

目录 前言 Vue.js 样式绑定 Vue.js class class 属性绑定 实例 1 实例 2 实例 3 实例 4 数组语法 实例 5 实例 6 Vue.js style(内联样式) 实例 7 实例 8 实例 9 Vue.js 组件 全局组件 全局组件实例 局部组件 局部组件实例 Prop Prop 实例 动态 Prop Pro…

echarts+echarts-gl vue2制作3D地图+下钻功能+标记点功能,解决dblclick事件失效问题,解决地图下钻后边框不更新保留问题

目录 先看实现效果&#xff1a;​编辑 步骤一 安装echarts和echarts-gl 步骤二 设置地图容器 在methods中设置初始化地图方法并在mounted中调用 在methods中设置初始化地图方法 在mounted中调用 打开页面效果&#xff1a;​编辑 步骤三 1、给地图添加双击事件dblcli…

Linux安装后门监测工具chkrootkit

官网&#xff1a;chkrootkit -- locally checks for signs of a rootkit locally checks for signs of a rootkit Chkrootkit is named Top 10 Tools to Scan Linux Servers for Vulnerability and Malware by Cyber Security News. Debian安装 sudo apt install chkrootkit#…

BigDecimal有哪些坑?

BigDecimal概述 BigDecimal是Java编程语言中的一个类&#xff0c;用于进行高精度的十进制数值计算。它提供了精确的数值表示和计算&#xff0c;可以处理比基本数据类型&#xff08;如double和float&#xff09;更大范围和更高精度的数字。 Java的基本数据类型&#xff08;如i…

在线考试教学系统平台系统源码/视频教学系统PHP源码/在线考试系统PHP源码

在线考试教学系统平台系统源码&#xff0c;视频教学系统PHP源码&#xff0c;在线考试系统PHP源码。 安装说明&#xff1a; 1、部署好网站环境&#xff1a;php5.6mysql 2、将源码传至网站根目录&#xff0c;php源码用二进制上传&#xff0c;或者上传压缩包在空间解压 3、将据库…

独热编码和Embedding

对于一个大小为N词典&#xff0c;给出一个N*N的矩阵。将这些词分别进行编码。再者&#xff0c;例如&#xff0c;香蕉与水果这两个词词意接近&#xff0c;我们引进余弦相似度来计算两者相似度。余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似。…

团体程序设计天梯赛-练习集L2篇⑧

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

css基础(三)

目录 一、CSS三大特性 1.层叠性 2.继承性 3.行高的继承 4.CSS三大特性之优先级 5.优先级注意的问题 6.CSS权重的叠加 二、盒子模型 1.盒子模型组成部分 2.盒子模型边框border 3.边框的复合写法 4.表格细线边框 5.边框会影响盒子实际大小 6.盒子模型内边距padding 7.盒子模型外边…