Loading [MathJax]/extensions/MathMenu.js

leetcode 887.鸡蛋掉落

leetcode leetcode 887.鸡蛋掉落
参考:https://github.com/labuladong/fucking-algorithm
讲得非常棒!


解法一:dp、二分搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution(object):
def superEggDrop(self, K, N):
memo = dict()
def dp(k, n):
if k == 1: return n
if n == 0: return 0
if (k,n) in memo:
return memo[(k, n)]
low, high = 1, n
res = float('INF')
while low <= high:
mid = (low+high)//2
broken = dp(k-1, mid-1)
not_broken = dp(k, high - mid)
if broken > not_broken:
high = mid- 1
res = min(res, broken+1)
else:
low = mid + 1
res = min(res, not_broken+1)

memo[(k,n)] = res
return res
return dp(K,N)

解法二:dp、逆向思维

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution(object):
def superEggDrop(self, K, N):
"""
:type K: int
:type N: int
:rtype: int
"""
dp = [[0] * (N+1) for _ in range(K+1)]
m = 0
while dp[K][m] < N:
m+=1
for k in range(1, K+1):
dp[k][m] = dp[k][m-1] + dp[k-1][m-1] + 1

return m

k代表鸡蛋数、m代表最坏情况下需要测试的次数
比如 k=1, m=7, 可以预测7层楼,dp[1][7] = 7。
线性增加m,当达到N层则直接输出最坏情况的测试次数m。

评论

Related Issues not found

Please contact @harrylin-hyl to initialize the comment

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×