LeetCode 887

https://leetcode.cn/problems/super-egg-drop/description/

难度:困难

高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/

定义状态为 dfs(i,j),表示在有 i 次操作机会和 j 枚鸡蛋的情况下,可以让我们能确定 f 值的最大建筑层数。

在 dfs(i−1,j−1)+1 楼扔第一枚鸡蛋:

  • 如果鸡蛋碎了,接下来只需要在 [1,dfs(i−1,j−1)] 中扔鸡蛋,就可以确定 f 的值。
  • 如果鸡蛋没碎,问题变成在有 i−1 次操作机会和 j 枚鸡蛋的情况下,可以让我们能确定 f 值的最大建筑层数。这个子问题的答案 dfs(i−1,j),加上 dfs(i−1,j−1) + 1,就是原问题的答案 dfs(i,j)。

所以有

dfs(i,j) = dfs(i−1,j) + dfs(i−1,j−1) + 1

时间复杂度:O(nk)。瓶颈主要在创建数组上。

空间复杂度:O(nk)。

class Solution {
public:
    int superEggDrop(int k, int n) {
        vector<vector<int>> f(n + 1, vector<int>(k + 1));
        for (int i = 1; ; i++) {
            for (int j = 1; j <= k; j++) {
                f[i][j] = f[i - 1][j] + f[i - 1][j - 1] + 1;
            }
            if (f[i][k] >= n) {
                return i;
            }
        }
    }
};