@@ -197,14 +197,14 @@ class Solution:
197197
198198我们只需要返回第一个返回值为 true 的 m 即可。
199199
200- 对于这种二段性的题目应该想到二分法,如果你没想起来,请先观看我的仓库里的二分专题哦。实际上不二分也完全可以通过此题目,具体参考下方代码区 ,有实现带二分的和不带二分的。
200+ 对于这种二段性的题目应该想到二分法,如果你没想起来,请先观看我的仓库里的二分专题哦。实际上不二分也完全可以通过此题目,具体下方代码 ,有实现带二分的和不带二分的。
201201
202202最后剩下一个问题。这个神奇的 f 函数怎么实现呢?其实很简单。
203203
204204- 摔碎的情况,可以检测的最高楼层是` f(m - 1, k - 1) + 1 ` 。因为碎了嘛,我们多检测了摔碎的这一层。
205205- 没有摔碎的情况,可以检测的最高楼层是` f(m - 1, k) ` 。因为没有碎,也就是说我们啥都没检测出来(对能检测的最高楼层无贡献)。
206206
207- 能检测的最高楼层就是两者的和,我们来看下代码 :
207+ 能检测的最高楼层就是两者的和,我们来看下二分代码 :
208208
209209``` py
210210class Solution :
@@ -225,6 +225,8 @@ class Solution:
225225 return l
226226```
227227
228+ 下面代码区我们实现不带二分的版本。
229+
228230## 代码
229231
230232代码支持:Python, CPP, Java, JavaSCript
@@ -234,20 +236,15 @@ Python:
234236``` py
235237class Solution :
236238 def superEggDrop (self , K : int , N : int ) -> int :
239+ dp = [[0 ] * (N + 1 ) for _ in range (K + 1 )]
237240
238- @cache
239- def f (m , k ):
240- if k == 0 or m == 0 : return 0
241- return f(m - 1 , k - 1 ) + 1 + f(m - 1 , k)
242- l, r = 1 , N
243- while l <= r:
244- mid = (l + r) // 2
245- if f(mid, K) >= N:
246- r = mid - 1
247- else :
248- l = mid + 1
249-
250- return l
241+ for m in range (1 , N + 1 ):
242+ for k in range (1 , K + 1 ):
243+ dp[k][m] = dp[k - 1 ][m - 1 ] + 1 + dp[k][m - 1 ]
244+ if dp[k][m] >= N:
245+ return m
246+
247+ return N # Fallback, should not reach here
251248```
252249
253250CPP:
@@ -328,8 +325,8 @@ var superEggDrop = function superEggDrop(K, N) {
328325
329326** 复杂度分析**
330327
331- - 时间复杂度:$O(m * K * logN )$
332- - 空间复杂度:$O(m * K)$
328+ - 时间复杂度:$O(N * K)$
329+ - 空间复杂度:$O(N * K)$
333330
334331对为什么用加法的同学有疑问的可以看我写的[ 《对《丢鸡蛋问题》的一点补充》] ( https://lucifer.ren/blog/2020/08/30/887.super-egg-drop-extension/ ) 。
335332
0 commit comments