leetcode1884. 鸡蛋掉落-两枚鸡蛋.动态规划-java

news2024/11/16 12:30:17

鸡蛋掉落-两枚鸡蛋

  • leetcode1884. 鸡蛋掉落-两枚鸡蛋
    • 题目描述
    • 解题思路
      • 代码演示
    • 动态规划
      • 代码演示
  • 动态规划专题

leetcode1884. 鸡蛋掉落-两枚鸡蛋

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/egg-drop-with-2-eggs-and-n-floors

题目描述

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

示例 1:
输入:n = 2
输出:2
解释:我们可以将第一枚鸡蛋从 1 楼扔下,然后将第二枚从 2 楼扔下。
如果第一枚鸡蛋碎了,可知 f = 0;
如果第二枚鸡蛋碎了,但第一枚没碎,可知 f = 1;
否则,当两个鸡蛋都没碎时,可知 f = 2。

示例 2:
输入:n = 100
输出:14
解释:
一种最优的策略是:- 将第一枚鸡蛋从 9 楼扔下。如果碎了,那么 f 在 0 和 8 之间。将第二枚从 1 楼扔下,然后每扔一次上一层楼,在 8 次内找到 f 。总操作次数 = 1 + 8 = 9 。- 如果第一枚鸡蛋没有碎,那么再把第一枚鸡蛋从 22 层扔下。如果碎了,那么 f 在 9 和 21 之间。将第二枚鸡蛋从 10 楼扔下,然后每扔一次上一层楼,在 12 次内找到 f 。总操作次数 = 2 + 12 = 14 。- 如果第一枚鸡蛋没有再次碎掉,则按照类似的方法从 34, 45, 55, 64, 72, 79, 85, 90, 94, 97, 99 和 100 楼分别扔下第一枚鸡蛋。
不管结果如何,最多需要扔 14 次来确定 f 。

提示:
1 <= n <= 1000

解题思路

这题不太容易想明白动态规划得状态转移方程,所以老规矩,我们先写暴力递归,然后改写动态规划,就容易了。

写暴力递归时,要先找出题目中得变量。很明显这个题中得变量是楼层和鸡蛋,
随着测试得进行,鸡蛋数量可能会减少,楼层数量也会减少。递归中,去不断变化这两个值。
知道大致思路了,我们可以先形成一个伪代码框架

for (i =1 ; i <= n;i++){
	int res ;
	//p1 和 p2 是在i层仍鸡蛋碎和没碎得两种情况。取最差情况,
	Math.min(res,Math,max(p1,p2));
}

在根据图来看下,状态如何转移得:
在这里插入图片描述
如果鸡蛋碎了,鸡蛋数减一,楼层搜索也变成【1,i - 1】层。
鸡蛋没碎,搜索变成N - i层,鸡蛋继续用。
状态变换和逻辑框架都有了,补上base case 就可以直接写代码了。

代码演示

   /**
     * 两个鸡蛋
     * @param n
     * @return
     */
    public int twoEggDrop(int n) {
        int k = 2;
        int[][] dp = new int[n + 1][k + 1];
        return process(n,k,dp);
    }

    /**
     * 递归
     * @param n n层楼
     * @param K k个鸡蛋.就是两个鸡蛋
     * @return
     */
    public int process(int n, int K,int[][]dp){
        if (n == 0){
            return 0;
        }
        if (n == 1){
            return 1;
        }
        //还剩一个鸡蛋时,要试 n次
        if(K == 1){
            return n;
        }
        if(dp[n][K] != 0){
            return dp[n][K];
        }
        int res = Integer.MAX_VALUE;
        for (int i = 1; i <= n;i++){
            //碎和没没碎两种情况
            //1.没碎时,去上面楼层
            int p1 = process(n - i,K,dp);
            //2.碎了,去下面楼层讨论
            int p2 = process(i - 1,K - 1,dp);
            res = Math.min(res,Math.max(p1,p2) + 1);
        }
        dp[n][K] = res;
        return res;
    }

动态规划

动态规划就是把暴力递归改写下,就可以了。
根据base case 初始化dp 表。
递归过程改写成从表中拿值得过程

代码演示

    /**
     * 动态规划
     * @param n
     * @return
     */
    public int twoEggDrop(int n) {
        int[][] dp = new int[n + 1][3];
        //初始化
        for (int j = 1; j <= 2; j++) {
            dp[1][j] = 1;
        }
        //初始化 一个鸡蛋时,
        for (int i = 1; i <= n; i++) {
            dp[i][1] = i;
        }
        //暴力递归改成dp表中拿值
        for (int i = 2; i <= n; i++) {
            dp[i][2] = Integer.MAX_VALUE;
            for (int p = 1; p <= i; p++) {
                int curr = Math.max(dp[p - 1][1], dp[i - p][2]) + 1;
                dp[i][2] = Math.min(dp[i][2], curr);
            }
        }
        return dp[n][2];
    }

动态规划专题

leetcode72. 编辑距离

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

leetcode123. 买卖股票的最佳时机 III

leetcode188. 买卖股票的最佳时机 IV

leetcode63. 不同路径 II

leetcode62. 不同路径

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

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

相关文章

基于Python和Spacy的命名实体识别

命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;方法&#xff0c;用于检测和分类文本中的命名实体&#xff0c;包括人物、组织、地点、日期、数量和其他可识别的现实世界实体。 Spacy是一个基…

STM32之HAL库微妙延迟(借助Systick)

代码 void bsp_us_delay(uint32_t us) {uint32_t start, now, delta, reload, us_tick;start SysTick->VAL;reload SysTick->LOAD;us_tick SystemCoreClock / 1000000UL;do {now SysTick->VAL;delta start > now ? start - now : reload start - now;} whi…

Element el-dropdown 事件

我这里是结合el-table一起使用 设置trigger"click" 就可以加点击事件 这里我需要点击下拉选择值后&#xff0c;既要得到下拉里面的值 也要得到这一行数据的值 重要的代码 <el-dropdowntrigger"click"command"handleCommand($event,scope.row,sc…

7 拓展中断_事件控制器(EXTI)

目录 EXTI-扩展中断和事件控制器 事件的概念 EXTI-扩展中断和事件控制器 EXTI外设框图 F1/F4/F7&#xff08;看懂与或门&#xff09; H7 STM32CubeMX中的EXTI配置 EXTI-扩展中断和事件控制器 事件的概念 STM32上许许多多的外设&#xff0c;是通过内部信号来协同工作的。…

VMware麒麟Kylin系统安装Linux

麒麟系统常用链接 https://www.jianshu.com/p/f58e2435b650 ios下载链接 https://eco.kylinos.cn/partners/mirror.html 其实基本上只有两个区别&#xff0c;一个是桌面操作系统和服务器操作系统的区别&#xff0c;一个是x86_64和arm内核的区别&#xff0c;我下的是这个海光版…

Splashtop 荣获2023年教育科技突破奖

2023年6月8日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公远程解决方案领域处于领先地位&#xff0c;该公司自豪地宣布其在教育科技突破奖评选活动中荣获“年度远程学习解决方案供应商奖”。这项在教育行业久负盛名的奖项特别关注创新性解决方案和创意公司&#xff0c;这些…

BlendOS 3 正在开发:承诺支持九个 Linux 发行版,无存储库更新

导读blendOS 发行版承诺混合 Arch Linux、Fedora Linux 和 Ubuntu&#xff0c;今年 4 月发布的 blendOS 2 使用 WayDroid&#xff0c;承诺运行 Android 应用程序。 开发商 Rudra Saraswat 表示&#xff0c;不可变发行版 blendOS 3 系统正在开发中&#xff0c;并承诺为不可变发行…

Nginx优化及防盗链

目录 一、隐藏版本号 1.查看版本号 2.修改配置文件 3.重启服务及查看版本号 二、修改用户 与组 1.修改配置文件 2.重启服务 三、缓存时间 1.修改配置文件 2.重启服务 3.测试访问 四、日志分割 1.写脚本 2.赋予执行权限并执行 3.验证 4.设置定时任务 五、连接超时 2…

ctfshow文件包含web87-117

1.web87 绕过死亡待可以使用rot13编码,还可以用base64编码,url两次编码&#xff0c;浏览器自动进行解码一次&#xff0c;代码解码一次&#xff0c;如果之编码一次&#xff0c;代码会被浏览器解码一次&#xff0c;这时候特殊字符还是url编码&#xff0c;而如php字符串则被还原&a…

扩增子高通量测序

扩增子测序是指利用合适的通用引物扩增环境中微生物的16S rDNA/18S rDNA /ITS高变区或功能基因&#xff0c;通过高通量测序技术检测PCR产物的序列变异和丰度信息&#xff0c;分析该环境下的微生物群落的多样性和分布规律&#xff0c;以揭示环境样品中微生物的种类、相对丰度、进…

人工智能数据集处理——数据清理2

目录 异常值的检测与处理 一、异常值的检测 1、使用3σ准则检测异常值 定义一个基于3σ准则检测的函数&#xff0c;使用该函数检测文件中的数据&#xff0c;并返回异常值 2、使用箱形图检测异常值 根据data.xlsx文件中的数据&#xff0c;使用boxplot()方法绘制一个箱型图 …

headscale专有网络及其ACL控制

如何使用 Headscale ( Tailscale 开源版 ) 快速搭建一个私有专属的 P2P 内网穿透网络 内网穿透简述 由于国内网络环境问题, 普遍家庭用户宽带都没有分配到公网 IP(我有固定公网 IP, 嘿嘿); 这时候一般我们需要从外部访问家庭网络时就需要通过一些魔法手段, 比如 VPN、远程软…

未来的编程语言「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 又一个编程语言火了&#xff0c;不算新&#xff0c;因为它已经开发了一段时间。不过在本周 Hacker News 上风头十足&#xff0c;DreamBerd 除了有点意思的改 ; 分隔符为 !&#xff0c;之外&#xff0c;它还能让你用问号来标注一段你也不确定…

通过adb获取ANR日志

1、命令行输入&#xff1a;adb bugreport 2、等待日志下载完毕&#xff0c;解压bugreport文件 3、进入FS-->data-->anr

【架构治理工具】在代码存储库中记录软件架构

Markdown 是一种标准的简单语法&#xff0c;用于创建具有专业外观的文档。它比 HTML 更简单&#xff0c;无需专门的编写编辑器即可进行管理。Git配置管理工具也支持markdown格式。在 Git 环境中&#xff0c;markdown 一般用于项目的简单介绍和构建说明。&#xff08;自述文件&a…

CSS 渐变

CSS 渐变 01 CSS 渐变基础 颜色的几种表示 渐变的几种方式 02 特殊的渐变举例 水平渐变 垂直渐变&#xff08;矩形四个点三种颜色&#xff09; 线性渐变只能在一个方向上渐变&#xff0c;要想实现这种渐变&#xff0c;可以使用两个标签进行叠加&#xff1a;一个负责水平…

npm运行没反应的问题

npm 遇到的问题 我们在经常切换node版的时候会遇到npm命令失效的问题。 我们不管运行npm的什么命令都是一闪然后就没有任何输出&#xff0c;效果如下&#xff1a; 主要原因是因为npm config set prefix 改包的路径出问题了 解决方法是&#xff1a;打开系统盘找到下列目录&am…

水力发电在可再生能源中的地位和潜力

可再生能源的发展已成为全球能源领域的重要趋势&#xff0c;而作为最古老、最成熟的可再生能源形式之一&#xff0c;水力发电在能源供应和环境保护方面发挥着重要作用。本文将深入探讨水力发电在可再生能源中的地位和潜力&#xff0c;包括其技术特点、发展趋势以及面临的挑战和…

多线程/std::thread线程退出方式详解

文章目录 概述不 join 也不 detach执行了detach并不能万事大吉建议使用 join 函数 概述 这里默认你已经了解 std::thread 类的基本使用&#xff0c;和WinAPI多线程编程中 “如何优雅的退出线程” 等相关知识。阅读该文前&#xff0c;建议先看看《多线程 /C 11 std::thread 类深…

考场作弊行为自动抓拍告警算法 yolov7

考场作弊行为自动抓拍告警系统通过yolov7python网络模型算法&#xff0c;考场作弊行为自动抓拍告警算法实时监测考场内所有考生的行为&#xff0c;对考生的行为进行自动抓拍&#xff0c;并分析判断是否存在作弊行为。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff…