leetcode 887 雞蛋掉落

2021-10-07 22:45:43 字數 2414 閱讀 9638

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 的值是多少。無...