Skip to content

Commit

Permalink
Update 0887. 鸡蛋掉落.md
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Aug 10, 2022
1 parent ef6bf4a commit b5b4dd7
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions Solutions/0887. 鸡蛋掉落.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

已知存在楼层 `f`,满足 `0 <= f <= n`,任何从高于 `f` 的楼层落下的鸡蛋都会碎,从 `f` 楼层或比它低的楼层落下的鸡蛋都不会碎。

每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 `x` 扔下(满足 `1 <= x <= n`),如果鸡蛋碎了,就不能再次使用它。如果
每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 `x` 扔下(满足 `1 <= x <= n`),如果鸡蛋碎了,就不能再次使用它。如果鸡蛋没碎,则可以再次使用。

**要求**:计算并返回要确定 `f` 确切值的最小操作次数是多少。

Expand All @@ -28,7 +28,7 @@

## 解题思路

这道题目的题意不是很容易理解,我们先把题目简化一下,忽略一些限制条件,理解简单情况下的题意。然后再一步步增加限制条件,从而弄明白这道题目的意思。以及思考解题思路
这道题目的题意不是很容易理解,我们先把题目简化一下,忽略一些限制条件,理解简单情况下的题意。然后再一步步增加限制条件,从而弄明白这道题目的意思,以及思考清楚这道题的解题思路

我们先忽略 `k` 个鸡蛋这个条件,假设有无限个鸡蛋。

Expand Down Expand Up @@ -61,13 +61,13 @@

每次扔鸡蛋都从区间的中间层去扔,这样每次都能排除当前区间一半的答案,从而最终确定鸡蛋不会摔碎的最高楼层 `f`

通过这种二分查找的方法,可以优化到 $\log n$ 次就能确定鸡蛋不贵摔碎的最高楼层 `f`
通过这种二分查找的方法,可以优化到 $\log n$ 次就能确定鸡蛋不会摔碎的最高楼层 `f`

因为 $\log n \le n$,所以通过二分查找的方式,「至少」比线性查找的次数要少。

同样,我们还可以通过三分查找、五分查找等等方式减少次数。

这是不限制鸡蛋个数的情况下,现在在给定 `n` 层楼的基础上,再限制一下鸡蛋个数为 `k`
这是在不限制鸡蛋个数的情况下,现在我们来限制一下鸡蛋个数为 `k`

现在题目要求:**已知有 `n` 层楼,`k` 个鸡蛋,求出至少需要扔几次鸡蛋,才能保证无论 `f` 是多少层,都能将 `f` 找出来?**

Expand Down Expand Up @@ -104,8 +104,7 @@ $dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$

给定鸡蛋 `k` 的取值范围为 `[1, 100]``f` 值取值范围为 `[0, n]`,初始化时,可以考虑将所有值设置为当前拥有的楼层数。

- 当鸡蛋数为 `1` 时,`dp[i][1] = i`。这是如果唯一的蛋碎了,则无法测试了。只能从低到高,一步步进行测试,最终最少测试数为当前拥有的楼层数。
- 如果刚开始初始化时已经将所有值设置为当前拥有的楼层数,则这一步可省略。
- 当鸡蛋数为 `1` 时,`dp[i][1] = i`。这是如果唯一的蛋碎了,则无法测试了。只能从低到高,一步步进行测试,最终最少测试数为当前拥有的楼层数(如果刚开始初始化时已经将所有值设置为当前拥有的楼层数,其实这一步可省略)。
- 当楼层为 `1` 时,在 `1` 层扔鸡蛋,`dp[1][j] = 1`。这是因为:
- 如果在 `1` 层扔鸡蛋碎了,则 `f < 1`。同时因为 `f` 的取值范围为 `[0, n]`。所以能确定 `f = 0`。
- 如果在 `1` 层扔鸡蛋没碎,则 `f >= 1`。同时因为 `f` 的取值范围为 `[0, n]`。所以能确定 `f = 0`。
Expand Down Expand Up @@ -148,7 +147,7 @@ class Solution:

上一步中时间复杂度为 $O(n^2 \times k)$。根据 $n$ 的规模,提交上去不出意外的超时了。

我们可以观察一下上面的状态转移方程 $dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$ 。
我们可以观察一下上面的状态转移方程$dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$ 。

这里最外两层循环的 `i``j` 分别为状态的阶段,可以先将 `i``j` 看作固定值。最里层循环的 `x` 代表选择的任意一层 `x` ,值从 `1` 遍历到 `i`

Expand Down

0 comments on commit b5b4dd7

Please sign in to comment.