Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c46e736

Browse files
Update 887.super-egg-drop.md
1 parent cbfc537 commit c46e736

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

‎problems/887.super-egg-drop.md

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
210210
class 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
235237
class 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

253250
CPP:
@@ -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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /