丢鸡蛋问题(Egg Dropping Puzzle)
丢鸡蛋问题的描述:有两个鸡蛋和一栋36层高的楼,我们希望知道36层高的哪个楼层把鸡蛋扔下会破裂,在哪些楼层扔鸡蛋不会使得鸡蛋破裂。我们做一些假设:
- 落下来的没有破碎鸡蛋可以再次使用
- 碎的鸡蛋不能够再次使用
- 如果鸡蛋掉落时破裂,那么如果从较高的楼层掉落,鸡蛋也会破裂
- 如果鸡蛋在跌落中没有破裂,那么它会在较低的楼层跌落也不会破裂
- 在一楼丢鸡蛋可能会破裂,在36楼丢鸡蛋可能不会破裂
如果只有一个鸡蛋,则只能以一种方式进行实验。 从一楼往下扔鸡蛋; 如果它没碎,则将其从二楼扔出。 继续向上直到鸡蛋破裂。 在最坏的情况下,此方法可能需要丢弃36次。 假设有两个鸡蛋, 那么我们应该扔多少次才能找到不会让鸡蛋碎的最高楼层?
问题实际上并不是找到最低的楼层,而是确定应该从哪层楼往下扔可以使得实验的次数最小。
问题思路:
假设我们从x层楼上将鸡蛋扔出,此时有两种情况
1 如果鸡蛋碎了,我们只需要用剩下的鸡蛋检查x - 1层楼。
2 如果鸡蛋没碎,鸡蛋的数量没变,并且我们只需要检查 k - x层楼。
我们要求最坏情况下的试验次数的最小值,对于每层楼,我们取以上两种情况的最大值,然后选择可以让实验次数最小的楼层
问题模型:
k: 楼层高度
n: 鸡蛋数量
eggDrop(n,k) 在最坏情况下 要找到关键楼层(使得鸡蛋不碎的最高楼层)需要试验的次数
eggDrop(n,k) = 1 + min{max(eggDrop(n-1,x-1),eggDrop(n,k-x)), x 的取值范围{1,2…,k}
代码
public class Solution{
public int eggDrop(int n, int k)
{
if (k == 1 || k == 0) //0层楼不用实验,1层楼只需要实验一次
return k;
if (n == 1) //一