本文仅作记录,并将该文中指代较为不明确的代码改写成Python代码:
对 M M M层楼丢 N N N个鸡蛋,复杂度 O ( M 2 ∗ N ) O(M^2*N) O(M2∗N)
def solution(m, n): # m层n个蛋
dp = [[j for j in range(m+1)] for i in range(n+1)] # dp[i][j] i个蛋j层楼至多测几次,初始化为楼层数
for i in range(2, n+1): # 显然,只有一个蛋时,测试次数就是楼层本身
for j in range(2, m+1): # 显然,如果是一层,测试次数就是楼层本身(即1)
# 第一次扔第k层 => 没碎:dp[i][j-k]+1; 碎了:dp[i-1][k-1]+1
dp[i][j] = min(dp[i][j], min([max(dp[i][j-k]+1, dp[i-1][k-1]+1) for k in range(1, j)]))
return dp[n][m]
更好的解法——复杂度: O ( N ) O(N) O(N)
def solution(m, n): # m层n个蛋
moves, dp = 0, [0] * (n+1) # dp[i] 表示i个鸡蛋,利用moves次移动,至多可以检测几层楼
while dp[n] < m:
for k in range(n, 0, -1):
# 下一步有k个鸡蛋时 => 没碎:dp[moves-1][k]; 碎了:1+dp[moves-1][k-1]
dp[k] += dp[k-1] + 1 # 即 dp[moves][k] = 1 + dp[moves-1][k-1] + dp[moves-1][k]
moves += 1
return moves