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

Leetcode 887. 鸡蛋掉落

1.题目基本信息

1.1.题目描述

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。

已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。

每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。

请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?

1.2.题目地址

https://leetcode.cn/problems/super-egg-drop/description/

2.解题方法

2.1.解题思路

对1到n的x个位置,如果x处碎了,则找下面的x-1段的最小操作数dp[x-1],同时次数的蛋只剩下k-1个;如果x处蛋没碎,则找上面的n-x段的的操作数dp[n-x],此时剩余蛋还是k个。最终获取所有x中最小的步数。

2.2.解题步骤

第一步,状态定义,这里的状态函数的方式,因为状态转移时即会用到大的n状态,也会用到小的n的状态。其中状态函数的输入值为剩余鸡蛋数k和待查找的楼层层数,返回该状态下的得到分界楼层f的最小步数。

第二步,递归进行状态转移。上下两段楼层的步骤是分别是一个随当前楼层x的递减函数dp(k,n-x)和递增函数dp(k-1,x-1),所以可以用二分法找到上下两段楼层中最大的步骤数的最小值。同时使用字典记忆每个已经获取的状态的值,减小程序开销。最终的dp(k,n)即为题解。

3.解题代码

Python代码

class Solution:# 对1到n的x个位置,如果x处碎了,则找下面的x-1段的最小操作数dp[x-1],同时次数的蛋只剩下k-1个;如果x处蛋没碎,则找上面的n-x段的的操作数dp[n-x],此时剩余蛋还是k个。最终获取所有x中最小的步数。# 第一步,状态定义,这里的状态函数的方式,因为状态转移时即会用到大的n状态,也会用到小的n的状态。其中状态函数的输入值为剩余鸡蛋数k和待查找的楼层层数,返回该状态下的得到分界楼层f的最小步数。# 第二步,递归进行状态转移。上下两段楼层的步骤是分别是一个随当前楼层x的递减函数dp(k,n-x)和递增函数dp(k-1,x-1),所以可以用二分法找到上下两段楼层中最大的步骤数的最小值。同时使用字典记忆每个已经获取的状态的值,减小程序开销。最终的dp(k,n)即为题解。def superEggDrop(self, k: int, n: int) -> int:# dp(k,n)为k个鸡蛋的情况下,n层楼需要的最小操作次数(注意:这里的n层楼可以从中间的开始)memo={}def dp(k,n):if (k,n) not in memo:if n==0:result1=0elif k==1:result1=nelse:left,right=0,n+1  # 左开右开区间while left+1<right:x=(right-left)//2+leftval1=dp(k-1,x-1)    # x的递增函数val2=dp(k,n-x)  # x的递减函数# 求最后一个val1小于val2对应的x# 红:val1<=val2的x,蓝:val1>=val2的x;left始终指向红,right始终指向蓝(相等的数特殊处理,同时给予红蓝属性)if val1<val2:left=xelif val1>val2:right=xelse:left=right=x# 此时right指向最后一个val1<val2的x,left指向第一个val1>=val2的x# result1=1+min(dp(k,n-right),dp(k-1,left-1))result1=1+min(max(dp(k - 1, x - 1), dp(k, n - x))for x in (left, right))memo[(k,n)]=result1return memo[(k,n)]return dp(k,n)

4.执行结果

在这里插入图片描述

相关文章:

  • SpringBoot启动过程简述 和 SpringCloud 的五大组键
  • C语言编写一个五子棋游戏-代码实例讲解与分析
  • 给 git 添加扩展命令
  • Qt实现远程开关机
  • Flink Lookup Join的工作原理、性能优化和应用场景
  • systemd使用入门
  • 数据结构——顺序表(基础代码题)
  • golang 如何生成唯一的 UUID
  • 一个OpenHarmony rk3568编译问题
  • 品牌增长新引擎:TikTok达人内容营销策略解析
  • 6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)
  • spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。
  • Python编码系列—Python访问者模式:为对象结构添加新功能的艺术
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • vue3 商城系统中的 sku 功能的实现
  • javascript 总结(常用工具类的封装)
  • javascript数组去重/查找/插入/删除
  • Java方法详解
  • Magento 1.x 中文订单打印乱码
  • mongodb--安装和初步使用教程
  • mysql常用命令汇总
  • Rancher-k8s加速安装文档
  • React16时代,该用什么姿势写 React ?
  • SQL 难点解决:记录的引用
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 给Prometheus造假数据的方法
  • 聊聊sentinel的DegradeSlot
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • ionic异常记录
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (11)iptables-仅开放指定ip访问指定端口
  • (3)llvm ir转换过程
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (七)Knockout 创建自定义绑定
  • (十三)Flask之特殊装饰器详解
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一)VirtualBox安装增强功能
  • (转)visual stdio 书签功能介绍
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .cn根服务器被攻击之后
  • .NET 8.0 发布到 IIS
  • .net core Swagger 过滤部分Api
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .Net Core与存储过程(一)
  • .NET Micro Framework 4.2 beta 源码探析
  • .net Signalr 使用笔记
  • .NET 中 GetProcess 相关方法的性能
  • .Net多线程总结
  • .NET企业级应用架构设计系列之技术选型
  • @EnableConfigurationProperties注解使用
  • @SuppressWarnings(unchecked)代码的作用