点击上方蓝字 关注我,涨知识

01

PART

扔鸡蛋实验

有一栋100层的楼,和2个坚硬的鸡蛋,从楼上扔下鸡蛋,鸡蛋会在大于某一层刚好开始碎,那最少几次能测出鸡蛋能承受的最大楼层呢?
如果从第50层扔下鸡蛋没碎,第51层扔下碎了,那鸡蛋能承受的最大楼层就是50。
注意:你手上只有2个鸡蛋,如果扔下碎了,就没法再使用了。

小明条件反射般作答,从1层开始往上测试,到第i层碎掉就有结果了。

小K说,这个方法确实可以测出来,但太慢了(当然暂不考虑下楼捡蛋的时间啦)。如果100层碎,最坏你得测试100次。如果先从第50层扔下呢?
这样分2种情况,碎和不碎:

  • 碎:则还有1个蛋,再从1层开始逐层往上测试,最坏测到49层,总共50次。

  • 不碎:则还有2个蛋,再从51层开始逐层往上测试,最坏测到100层,总共51次。

小明说,这个方法确实好一些,等等,你刚才说第2种情况是什么?

小明接着说,你还有2个蛋啊,兄弟,为啥不充分利用呢?
不考虑1-50层,可以把51-100层看成一栋新的楼,现在问题就变成用2个蛋测量50层楼,和原始问题并没有本质区别啊,只是规模更小了。

因为还有2个蛋,所以可以在75层再测试一次,就算碎了,也还有1个蛋,再从低层往上逐层测试。
这个问题包含了规模更小的子问题,引导我们可以先从小规模的问题来思考。

02

PART

小规模的子问题

1.如果只有1个蛋,要怎么测量呢?
为了一定能测试出结果,只能从1层开始逐层往上,最坏总共要100次。

如果有n层楼,就需要n次,没有更好的方法。

2.如果有2个蛋,考虑最小的情况,1,2,3层楼
1层楼,只需1次,而且能看出鸡蛋数超过楼层数没意义。

2层楼,分别先从1、2层扔,枚举所有的情况。最好的方案是总共要2次。

3层楼,分别先从1,2,3层扔。可以看出从1或3层扔情况是等价的。且扔下一个鸡蛋后,问题会转化成2层或1层的子问题,这个在上一步已经求出结果了。
从这3种情况中选择最好的方案,就是先从2层扔,总共要2次。

3.如此类推下去,就可以算出4,5,6...100层的最少次数。
100层如下:

  • 从1层扔:碎,剩0层1蛋;不碎,剩99层2蛋

  • 从2层扔:碎,剩1层1蛋;不碎,剩98层2蛋

  • ......

  • 从99层扔:碎,剩98层1蛋;不碎,剩1层2蛋

  • 从100层扔:碎,剩99层1蛋;不碎,剩0层2蛋

每一层扔下去的次数为:碎和不碎中选最大的(要考虑最坏的情况),再加这一层扔的次数,需要+1。
再从上面所有情况中,选择次数最少的方案。

100层的具体测试方案如下:

03

PART

推广:N层楼,M个蛋

为描述方便,设










表示




层楼,




个鸡蛋最小要测试的次数。
从第




层扔下

  • 碎,
























  • 不碎,






















04

PART

代码实现

4.1

初始化

const int FLOOR = 101;
const int EGG = 3;
int f[FLOOR][EGG];
for (int i = 0; i < FLOOR; ++i) {for (int j = 0; j < EGG; ++j) {f[i][j] = 0x7fffffff;}
}
// i层楼,1个鸡蛋
for (int i = 1; i < FLOOR; ++i) f[i][1] = i;
//0,1层楼,i个鸡蛋
for (int i = 1; i < EGG; ++i) {f[0][i] = 0;f[1][i] = 1;
}

4.2

递推过程

int main() {for (int j = 2; j < EGG; ++j) {for (int i = 2; i < FLOOR; ++i) {// 尝试从1到i层楼扔下,在最坏的情况中选择最好的for (int k = 1; k <= i; ++k) {int temp = max(f[k - 1][j - 1], f[i - k][j]) + 1;f[i][j] = min(temp, f[i][j]);}}}cout << f[100][2] << endl;return 0;
}

05

PART

几组测试数据

观察上面数据,会发现增加到6个蛋时,100、1000层楼的次数并没有减少,这说明最小次数是有极限的。
那怎么计算这个最小的极限呢?
想象一下,如果有无数个蛋,会是怎样呢?这时你可以不用考虑蛋碎了会不够用的问题,那你会怎么去测试?
没错,这不就是最简单的二分查找吗,每次从中间的楼层测试,那最少就是










次。

关注我,涨知识

原创不易,感谢分享

转发,点赞,在看

往期精彩回顾

知乎高赞:拼多多和国家电网,选哪个?

LeetCode1-220题汇总,希望对你有点帮助!

5个无聊Python程序,用Python整蛊你的朋友们吧

经典算法面试题:高楼扔鸡蛋相关推荐

  1. 经典算法面试题及答案

    经典算法面试题及答案  1. 时针分针重合几次 表面上有60个小格,每小格代表一分钟, 时针每分钟走1/12小格,分针每分钟走1小格,从第一次重合到第二次重合分针比时针多走一圈即60小格,所以 60/ ...

  2. leetcode常见经典算法面试题及答案汇总

    精心整理了leetcode常见经典算法面试题及答案,实现语言为python和c++,整理在这里主要是为了面试前复习使用,希望对您有所帮助,题目比较多建议您先收藏 题目:1.求缺失的第一个正数;2. 字 ...

  3. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  4. 程序员应该掌握的经典算法面试题

    不忘初心,方得始终.何谓"初心"?初心便是在深度学习.人工智能呼风唤雨的时代,对数据和结论之间那条朴素之路的永恒探寻,是集前人之大智,真诚质朴求法向道的心中夙愿. 没有最好的分类器 ...

  5. 算法面试题:扔玻璃杯的学问

    扔玻璃杯的学问 问题简述 在算分研讨班上第一节课听到的有趣问题,据说是鹅厂面试题: 有一种玻璃杯质量确定但未知,需要检测. 有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎. 现给你两个杯子, ...

  6. java 算法笔试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  7. java算法面试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  8. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

  9. 经典谷歌面试题:高楼扔鸡蛋

    经典谷歌面试题:高楼扔鸡蛋 存在某T层高楼,在该高楼中存在这样的一层,在该层之下的所有楼层扔鸡蛋,鸡蛋摔到地上都不会碎,还可以继续扔:在该层及该层之上的所有楼层,扔下鸡蛋都会摔碎. 目前手里有两个鸡蛋 ...

最新文章

  1. 关于Ping命令的问题
  2. 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度
  3. GitHub上创建组织
  4. c语言的程序结构语序,第3章 C语序结构.doc
  5. java web w3c_1.3 搭建Java Web开发环境
  6. 三星S10指纹识别玩脱了!多家金融APP关闭指纹登陆功能
  7. Redis高可用之持久化
  8. linux mysql ssh通道_通过SSH通道来访问MySQL
  9. 收藏精美网页设计作品的200佳网站推荐(系列五)
  10. pdf pmp书籍第六版_PMP项目管理知识体系指南PMBOK第六版高清中文版PDF下载.pdf
  11. 小米笔记本 镜像_小米笔记本Pro Windows 10 原装系统镜像
  12. 详解如何用爬虫工具批量采集阿里巴巴批发网商品数据
  13. 服务器cpu占用过高一般是什么原因,常见云服务器CPU占用100%问题原因及解决办法...
  14. 8.2 使用Alpha混合技术
  15. mysql 多主多从
  16. vue3+vite3+vant搭建移动端简易模版
  17. 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
  18. 【20保研】山东财经大学关于举办2019年优秀大学生夏令营的通知
  19. android adapter点击事件,Activity中响应Adapter的点击回调事件
  20. RISC-V又一开源SoC-zqh_riscv

热门文章

  1. TabLayout横排滑动
  2. 深度学习分类基础概念对ACC、PPV、TPR、TNR
  3. HTC G13/野火S/A510e获取得root-经本人测试很好用
  4. 会议记录录音转文字的软件哪个好?看完你就知道了
  5. 维拉智能管家机器人_维拉app下载-维拉(智能机器人)软件下载v2.2.5- 游侠下载站...
  6. Spring的@Bean注解使用
  7. 使用世界银行的GDP数据进行可视化(Python,tableau,地图可视化等)
  8. 做了一把电子尺,精度出乎意料
  9. UG加工外形不抬刀连续切削设置
  10. Ubuntu 通过 ssh 传输文件