题目背景:
有n层楼,m个鸡蛋。
有一个临界点x,鸡蛋从临界点x上面掉落就会碎,从临界点x及临界点x以下掉落就不会碎。
求计算出x的确切值需要扔鸡蛋的最小次数
考虑特殊情况
以有100层楼为例
两个极端情况:
- 假设只有一个鸡蛋,那么就需要从下到上依次去尝试,比如x=30,肯定是要先从第一楼扔下去,再从第二楼扔下去,一直尝试到第30楼;如果一开始就是从第50楼扔下去的话,无法确定具体范围。
- 假设有无限个鸡蛋,那么我们可以用二分来缩小范围,最后需要的次数就是log2(n)
两枚鸡蛋
现在考虑一下2枚鸡蛋的情况
我们可以用第一枚鸡蛋缩小范围,用第二枚鸡蛋精准定位,比如100层的话,可以分为10组,每组都有10层楼。
从第一组开始试验,如果试验到第三组,鸡蛋破碎,那么第二组肯定是没问题的,所以临界点x一定在第三组里,再用第二个鸡蛋从低楼层开始试验,先试21楼,22楼这样。
这样最少的次数是1,最多的次数是19。
有没有可能平均一下呢
如果间隔相等的话,对于第二枚鸡蛋,扔的次数都是一样多的,但是对于第一枚鸡蛋,临界值越往后,扔的次数越多,所以可不可以修改一下间隔,让前面的间隔大,后面的间隔小,这样平衡一下平均次数呢
假设第一组的楼层数为t,第二层的为t-1,第三层的为t-2,这样以此类推,最后一层的为1
所以就是t+t-1+t-2+t-3+……+1>=n
根据公式可以显而易见的得出结果
代码如下:注意要上取整
class Solution {
public:
int twoEggDrop(int n) {
return ceil((-1+sqrt(1+8*n))/2);
}
};
n枚鸡蛋
假设dp[i] [j] 表示用i层楼 j个鸡蛋最少试几次能够找到临界点
测评地址
时间复杂度 O (