你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。

每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。

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

每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。

你的目标是确切地知道 F 的值是多少。

无论 F 的初始值如何,你确定 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

思路分析:\color{blue}思路分析:思路分析:这道题就是非常绕,让人感觉好像答案只与鸡蛋的数量有关系。但这答题遇到了老衲,老衲定要解开它的真面目。话不多说,开始解题。

难点一:这道题的“移动”是不受空间限制的,我们潜意识里可能会认为它是爬楼的次数,
认为在上次扔鸡蛋的位置进行爬楼转移到下一个位置所移动楼层的数目。
蛋式题目并不是这个意思,题干说“每次移动,把它从任一楼层 X 扔下”,也就是说 你可以测试多少次或者说你可以仍多少次鸡蛋\color{red}你可以测试多少次或者说你可以仍多少次鸡蛋你可以测试多少次或者说你可以仍多少次鸡蛋。

难点二:对于折半查找数的游戏大家都应该知道,所以对于[1, 2,3,4 …, N]这些楼层,我们使用折半查找的思路先在(N + 1) / 2这一楼层丢鸡蛋,判断是否破碎。
如果鸡蛋碎了,则F在[1, (N + 1) / 2 - 1],否则鸡蛋没有碎,F在[(N + 1) / 2, N]。
这样给人的感觉就是只和鸡蛋的数量有关,如果鸡蛋够,使用二分法来测试,则必定会测试出F,如果鸡蛋不够。
蛋式你有没有想过,如果你有无数个鸡蛋,蛋我只给你1次移动(“扔鸡蛋”)的机会,你咋办?你还能说用二分法来测试么? (难点一就告诉我们扔鸡蛋的次数很重要),因此这道题并不是用折半查找来解决问题。

难点三:如果你只有一次扔鸡蛋的机会(鸡蛋数不限制)\color{red}只有一次扔鸡蛋的机会(鸡蛋数不限制)只有一次扔鸡蛋的机会(鸡蛋数不限制),你能最多确定的最多楼层数是多少?
假设我们选择第一层扔鸡蛋,如果鸡蛋碎了,则F == 0,否则鸡蛋没有碎,则F == 1。根据结果发现,扔在第一楼,这一楼就可以确定是不是F。这时和鸡蛋的数量没有关系,因为扔了这一次,你已经没有扔的机会。
假设我们选择其他楼层x(x > 1),如果鸡蛋碎了,则F < x,如果鸡蛋没有碎,则F >= x。接下来呢?游戏结束了!!!你只有一次扔鸡蛋的机会!!!
所以如果你只有一次扔鸡蛋的机会,这时你只能在第一层扔鸡蛋,这样你就能确定一层是否是F。

它还告诉我们,如果你有N次测试机会,哪怕你只有一个鸡蛋,你也可以找出任意的F,你从第一层测试,逐渐往上测试,并且会确定F。

难点四:经过若干次扔鸡蛋,你已经确定了[0, h]都没有碎,则F >= h,不确定的楼层为[h, N]。这时我们采用上面的策略,在第h + 1层扔鸡蛋(注意不是第h层,第h层已经知道了不会碎),如果鸡蛋碎了则F = h,否则鸡蛋没有碎,F > h,这时你又确定了F不在第h层,所以增加了一层。

如果你有remainTestCount个测试机会(扔鸡蛋的机会 或者移动的次数),eggsCount个鸡蛋,这时我们任意选择在第x层扔鸡蛋,如果鸡蛋没碎,这时你还剩余remainTestCount - 1次机会,eggsCount个鸡蛋,我们可以确定x下面的getConfirmFloors(remainTestCount - 1, eggsCount) 层
如果鸡蛋碎了,这时你还剩余remainTestCount - 1次机会,eggsCount - 1个鸡蛋,我们可以确定getConfirmFloors(remainTestCount - 1, eggsCount - 1)层,并且x层也被确定了
因此可以得出规律:

getConfirmFloors(remainTestCount, eggsCount) = getConfirmFloors(remainTestCount - 1, eggsCount) + getConfirmFloors(remainTestCount - 1, eggsCount - 1) + 1

其中getConfirmFloors(remainTestCount, eggsCount) 表示的是在remainTestCount个测试机会(扔鸡蛋的机会 或者移动的次数),eggsCount个鸡蛋可以确定的楼层数量

class Solution {public:int superEggDrop(int K, int N) {int remainTestCount = 1;//穷举移动次数(测试的次数)while (getConfirmFloors(remainTestCount, K) < N){++remainTestCount;}return remainTestCount;}//在remainTestCount个测试机会(扔鸡蛋的机会 或者移动的次数),eggsCount个鸡蛋可以确定的楼层数量int getConfirmFloors(int remainTestCount, int eggsCount){if (remainTestCount == 1 || eggsCount == 1){(难点三、四)//如果remainTestCount == 1你只能移动一次,则你只能确定第一楼是否,也就是说鸡蛋只能放在第一楼,如果碎了,则F == 0,如果鸡蛋没碎,则F == 1//如果eggsCount == 1鸡蛋数为1,它碎了你就没有鸡蛋了,为了保险,你只能从第一楼开始逐渐往上测试,如果第一楼碎了(同上),第一楼没碎继续测第i楼,蛋式你不可能无限制的测试,因为你只能测试remainTestCount次return remainTestCount;}return getConfirmFloors(remainTestCount - 1, eggsCount - 1) + 1 + getConfirmFloors(remainTestCount - 1, eggsCount);}
};

LeetCode 鸡蛋掉落(最清晰的解法)相关推荐

  1. 【leetcode】鸡蛋掉落问题

    在leetcode刷动态规划问题过程中,鸡蛋掉落问题是比较经典的,特别是笔试面试喜欢出的问题.腾讯,Vivo等大厂都出现过,在这里通过自己学习,以及借鉴大佬的思路,对这道题进行整理. 其它算法问题刷题 ...

  2. 算法题:鸡蛋掉落(leetcode 887题)

    题目: 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  3. 装鸡蛋的鞋子java代码_Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)...

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  4. [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]

    [问题描述] [887. 鸡蛋掉落] 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去.你知道存在楼层 F ,满足 ...

  5. LeetCode887题:鸡蛋掉落——动态规划法与数学法

    1. 问题介绍 关于临界楼层查找问题的最优查找策略,我已经在上一篇博客摔玻璃球(鸡蛋)查找临界楼层中做了详细讲解,本文将继续研究相关问题. 假如题目不要求给出具体的最优查找策略,只问最坏情况下至少需要 ...

  6. 每日一题 11.4 鸡蛋掉落

    每日一题 11.4 鸡蛋掉落 一.题目概述 这是一道困难题,难度肯定是比前三天的要大的,这个毋庸置疑,但是毕竟趣味性在这里摆着,和昨天那个相比,钻研这个的兴趣要更大一点,昨天那个并查集和哈希表实在是太 ...

  7. LeetCode887题:鸡蛋掉落——官方题解方法一、二详解

    关于LeetCode887题:鸡蛋掉落的解法,我在LeetCode887题:鸡蛋掉落--动态规划法与数学法中已经讲得很清楚了,但其官方题解中有新的解法,本文将对其方法一和方法二进行解读. 首先定义变量 ...

  8. dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题

    dp 扔鸡蛋 Problem statement: You are given N floor and K eggs. You have to minimize the number of times ...

  9. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

最新文章

  1. mysql udate 充值_分享下一个mysql的充值记录系统
  2. 超详细的Python中的字符串常识【赶紧收藏】
  3. html5实现获取地理位置信息并定位
  4. 启动targetcli时遭遇ImportError: cannot import name ALUATargetPortGroup故障
  5. noclobber:避免文件的重写
  6. 【ajax 】同步、异步交互流程的区别
  7. linux下检测硬盘,【转载】linux下硬盘监控诊断工具SmartTools
  8. vue和react的区别是什么?
  9. angularJS限制 input-text 只能输入数字
  10. Gartner发布云安全能力评估报告:阿里云全球第二,超过亚马逊!
  11. 设计社交网络的数据结构
  12. numpy 归一化_图卷积网络到底怎么做,这是一份极简的Numpy实现
  13. 工作效率上的错觉(转载)
  14. unity 反编译 step1 disUnity
  15. 基于Bootstrap 3可预览的HTML5文件上传插件
  16. c语言中的右移是逻辑右移还是算术右移的问题
  17. 使用腾讯云 SCF 云函数压缩 COS 对象存储文件
  18. 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】
  19. zip包怎么解压oracle,使用jar与zip压缩解压文件的区别
  20. 用计算机处理图像属于啥技术,计算机图像处理技术在网页设计中的应用

热门文章

  1. 自定义模板、自定义打印机、自动打印:grid++ report自动打印、clodop预览和自动打印(electron+vue)
  2. 独家数据 深度解析|Axie Infinity--GameFi社区收益达到150亿美元之路【第二期】
  3. 什么是DNS域名解析?
  4. LaTeX 免费神器!再也不怕复杂的公式了
  5. 微星Z390主板双SSD+HDD,win10系统下安装Ubuntu18.04系统借鉴参考
  6. 第四章 SpringCloud Alibaba (一)微服务环境搭建
  7. 安全合规/ISO--6--ISO 27001/27017/27018内审项清单
  8. Normal Libs For Javascript
  9. JAVA 设计模式—————— 命令模式和职责链模式
  10. 关于PNG导入Unity透明通道不显示为黑色的曲线救国方法