887. 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。
每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。
你知道存在樓層 f ,滿足 0 <= f <= n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。
你的目標是確切地知道 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
#使用遞迴加記錄表的演算法
class
solution
:def
supereggdrop
(self, k:
int, n:
int)
->
int:
defparse
(k, n)
:if n ==1:
# 如果只有1層,不管有多少蛋只需試1次
return
1elif n ==0:
return
0elif k ==1:
# 只有1個雞蛋,則只能逐層試
return n
elif
(k, n)
in table:
return table[
(k, n)
] f =
float
('inf'
)# 定義乙個無限大數作為初始條件
for x in
range(1
, n +1)
:# 將雞蛋扔在第x層,從第1層開始
fx =1+
max(parse(k -
1, x -1)
, parse(k, n - x)
) f =
min(f, fx)
table[
(k, n)
]= f
return f
table =
# 記憶被計算過的情況
#使用動態規劃表計算
class
solution
:def
supereggdrop
(self, k:
int, n:
int)
->
int:
dp =[[
0]*(n+1)
for _ in
range
(k+1)]
#這裡有之前不一樣的是,每列每列的計算,之前是每行每行的計算
#差別說就是 dp[i][j] = dp[i-1][j-1] + dp[i][j-1] + 1是與左上角和,左邊的數計算
#但是我們的初始條件不能構建出012345.。。,只有豎著計算才能構建出初始值
for j in
range(1
, n+1)
: dp[0]
[j]=
0for i in
range(1
, k+1)
: dp[i]
[j]= dp[i-1]
[j-1
]+ dp[i]
[j-1]+
1#規劃的方程式
if dp[i]
[j]>= n:
#當大於等於樓層高度的時候,返回仍的次數
return j
if __name__ ==
"__main__"
: s = solution(
)print
(s.supereggdrop(k=
3, n=14)
)
LeetCode 887 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...
leetcode887 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...
Leetcode 887 雞蛋掉落
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...