[算法][經典面試題]M層樓扔雞蛋問題

引用:一篇文章帶你搞定經典面試題之扔雞蛋問題
原題:LeetCode 0887. 雞蛋掉落


本文僅作記錄,並將該文中指代較爲不明確的代碼改寫成Python代碼:

MM層樓丟NN個雞蛋,複雜度O(M2N)O(M^2*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個蛋n層樓至多測幾次,初始化爲樓層數
    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)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章