难度:困难
题目内容:
你将获得 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
题解:
emmm我的第一个想法就是二分法,那最坏的情况自然是二分的次数
class Solution:
def superEggDrop(self, K: int, N: int) -> int:
if N == 1:
return 1
elif N == 0:
return 0
if N % 2 == 0:
return self.superEggDrop(K,N//2) + 1
if N % 2 == 1:
return self.superEggDrop(K,N//2+1) + 1
尝试一下发现果然没有我想的这么简单。。。前面几个还对,后面就都错了
(因为你考虑的太粗糙了啊蠢货)
看看官方题解发现竟然是谷歌的一道经典面试题
解起来虽然麻烦但是条理还是蛮清晰的
如果有K个鸡蛋,N个楼层,那么在第X楼()抛下时,如果鸡蛋没碎
那么F肯定大于N,剩余待定楼层数为N-F
,剩余鸡蛋为K
如果碎了,那么F肯定是小于等于X,X以下的待定楼层数为X-1,鸡蛋数也减一,为K-1
所以(K,N)的状态转移方程为
什么意思呢,就是每次我们进行抛鸡蛋实验,肯定都要做一次实验,所以就要+1
如果是最坏情况的话,那肯定是递归需要步数最多的情况,所以就是
在最坏情况下的最小值,那就是外面要加min了
和分别是关于X的增函数和关于X的减函数。要使得他们两个的最大值最小,应该找到两个函数的交点(这个max函数的图像应该是像一个倒着的小山一样)
由于X是离散的,所以不一定正好能取到焦点
因此可以找交点附近的数,一个大一个小,然后在这两处分别比较man函数的值,选取小的那个。
网友评论