|
9 | 9 |
|
10 | 10 | 已知存在楼层 `f`,满足 `0 <= f <= n`,任何从高于 `f` 的楼层落下的鸡蛋都会碎,从 `f` 楼层或比它低的楼层落下的鸡蛋都不会碎。
|
11 | 11 |
|
12 | | -每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 `x` 扔下(满足 `1 <= x <= n`),如果鸡蛋碎了,就不能再次使用它。如果 |
| 12 | +每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 `x` 扔下(满足 `1 <= x <= n`),如果鸡蛋碎了,就不能再次使用它。如果鸡蛋没碎,则可以再次使用。 |
13 | 13 |
|
14 | 14 | **要求**:计算并返回要确定 `f` 确切值的最小操作次数是多少。
|
15 | 15 |
|
|
28 | 28 |
|
29 | 29 | ## 解题思路
|
30 | 30 |
|
31 | | -这道题目的题意不是很容易理解,我们先把题目简化一下,忽略一些限制条件,理解简单情况下的题意。然后再一步步增加限制条件,从而弄明白这道题目的意思。以及思考解题思路。 |
| 31 | +这道题目的题意不是很容易理解,我们先把题目简化一下,忽略一些限制条件,理解简单情况下的题意。然后再一步步增加限制条件,从而弄明白这道题目的意思,以及思考清楚这道题的解题思路。 |
32 | 32 |
|
33 | 33 | 我们先忽略 `k` 个鸡蛋这个条件,假设有无限个鸡蛋。
|
34 | 34 |
|
|
61 | 61 |
|
62 | 62 | 每次扔鸡蛋都从区间的中间层去扔,这样每次都能排除当前区间一半的答案,从而最终确定鸡蛋不会摔碎的最高楼层 `f`。
|
63 | 63 |
|
64 | | -通过这种二分查找的方法,可以优化到 $\log n$ 次就能确定鸡蛋不贵摔碎的最高楼层 `f`。 |
| 64 | +通过这种二分查找的方法,可以优化到 $\log n$ 次就能确定鸡蛋不会摔碎的最高楼层 `f`。 |
65 | 65 |
|
66 | 66 | 因为 $\log n \le n,ドル所以通过二分查找的方式,「至少」比线性查找的次数要少。
|
67 | 67 |
|
68 | 68 | 同样,我们还可以通过三分查找、五分查找等等方式减少次数。
|
69 | 69 |
|
70 | | -这是不限制鸡蛋个数的情况下,现在在给定 `n` 层楼的基础上,再限制一下鸡蛋个数为 `k`。 |
| 70 | +这是在不限制鸡蛋个数的情况下,现在我们来限制一下鸡蛋个数为 `k`。 |
71 | 71 |
|
72 | 72 | 现在题目要求:**已知有 `n` 层楼,`k` 个鸡蛋,求出至少需要扔几次鸡蛋,才能保证无论 `f` 是多少层,都能将 `f` 找出来?**
|
73 | 73 |
|
@@ -104,8 +104,7 @@ $dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$
|
104 | 104 |
|
105 | 105 | 给定鸡蛋 `k` 的取值范围为 `[1, 100]`,`f` 值取值范围为 `[0, n]`,初始化时,可以考虑将所有值设置为当前拥有的楼层数。
|
106 | 106 |
|
107 | | -- 当鸡蛋数为 `1` 时,`dp[i][1] = i`。这是如果唯一的蛋碎了,则无法测试了。只能从低到高,一步步进行测试,最终最少测试数为当前拥有的楼层数。 |
108 | | - - 如果刚开始初始化时已经将所有值设置为当前拥有的楼层数,则这一步可省略。 |
| 107 | +- 当鸡蛋数为 `1` 时,`dp[i][1] = i`。这是如果唯一的蛋碎了,则无法测试了。只能从低到高,一步步进行测试,最终最少测试数为当前拥有的楼层数(如果刚开始初始化时已经将所有值设置为当前拥有的楼层数,其实这一步可省略)。 |
109 | 108 | - 当楼层为 `1` 时,在 `1` 层扔鸡蛋,`dp[1][j] = 1`。这是因为:
|
110 | 109 | - 如果在 `1` 层扔鸡蛋碎了,则 `f < 1`。同时因为 `f` 的取值范围为 `[0, n]`。所以能确定 `f = 0`。
|
111 | 110 | - 如果在 `1` 层扔鸡蛋没碎,则 `f >= 1`。同时因为 `f` 的取值范围为 `[0, n]`。所以能确定 `f = 0`。
|
@@ -148,7 +147,7 @@ class Solution:
|
148 | 147 |
|
149 | 148 | 上一步中时间复杂度为 $O(n^2 \times k)$。根据 $n$ 的规模,提交上去不出意外的超时了。
|
150 | 149 |
|
151 | | -我们可以观察一下上面的状态转移方程$dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$ 。 |
| 150 | +我们可以观察一下上面的状态转移方程:$dp[i][j] = min_{1 \le x \le n} (max(dp[i - x][j], dp[x - 1][j - 1])) + 1$ 。 |
152 | 151 |
|
153 | 152 | 这里最外两层循环的 `i`、`j` 分别为状态的阶段,可以先将 `i`、`j` 看作固定值。最里层循环的 `x` 代表选择的任意一层 `x` ,值从 `1` 遍历到 `i`。
|
154 | 153 |
|
|
0 commit comments