# 鸡蛋掉落
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/super-egg-drop 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。
已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。
每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?
示例 1:
输入:k = 1, n = 2
输出:2
解释:鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
如果它没碎,那么肯定能得出 f = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。
示例 2:
2
3
4
5
6
7
输入:k = 2, n = 6
输出:3
示例 3:
2
3
输入:k = 3, n = 14
输出:4
2
提示:
1 <= k <= 100 1 <= n <= 104
问题转化:
N:楼层高度;
F:鸡蛋能够承受的高度,鸡蛋在F层机以下不会碎,在F层之上会碎;可得知:0<= F <= N
K:鸡蛋个数
T:测试扔鸡蛋次数
所以原题简单话说:有N 个楼层,有 K 个蛋,求最少要扔 T 次,才能保证当 F 无论是 0 <= F <= N 中哪个值,都能测试出来
可以将此题转化为:有K个蛋,扔T次,求可以确认的F的层数;
因为0 <= F <= N,所以当F==N的时候就是我们所求的T次数
其中K已明确,T未知,则可以将T从小到达推演
当只有一个蛋时,只能从第一层逐层开始测试,所以,F = T+1
当只有一个机会时,再多蛋也没用,只能测出F = 2,
其他情况时:从x层测试,如果蛋碎了,机会减1,继续求解 F (K-1,T-1)【这一层的下方能测的层数有 F (K-1,T-1)层】,如果蛋没碎,机会减1,则继续求解F(K,T-1)【在这一层的上方能测的层数有 F(K,T-1)层】;将两个可测的层数相加就是 F(K,T)
所以关系式为:
F(K,T) = F (K-1,T-1) + F(K,T-1)
/**
* @param {number} k
* @param {number} n
* @return {number}
*/
var superEggDrop = function (k, n) {
let T = 1
while (F(k,T)<=n){
T++
}
return T
function F(K,T){
if(K==1||T==1) return T+1
return F(K,T-1) + F(K-1,T-1)
}
};
let t = superEggDrop(4,6)
console.log(t)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
← 链表中倒数第K个节点 KMP字符串匹配 →