DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

[887] 鸡蛋掉落

动态规划

details

自顶向下递归

var superEggDrop = function (k, n) {
    let map = new Map();
    return dfs(k, n);

    function dfs(k, n) {
        if (k === 1) return n;
        if (n === 0) return 0;

        const key = `${k}-${n}`;
        if (map.has(key)) return map.get(key);
        let res = Infinity;
        for (let i = 1; i <= n; i++) {
            res = Math.min(res, Math.max(dfs(k - 1, i - 1), dfs(k, n - i)) + 1);
        }
        map.set(key, res);
        return res;
    }
};

二份查找优化

var superEggDrop = function (k, n) {
    let map = new Map();
    return dfs(k, n);

    function dfs(k, n) {
        if (k === 1) return n;
        if (n === 0) return 0;

        const key = `${k}-${n}`;
        if (map.has(key)) return map.get(key);
        let res = Infinity;
        let l = 1,
            r = n;
        while (l <= r) {
            let mid = Math.floor((l + r) / 2);
            let eggBreak = dfs(k - 1, mid - 1); // 鸡蛋碎了,探索下半部分
            let eggNotBreak = dfs(k, n - mid); // 鸡蛋没碎,探索上半部分

            res = Math.min(res, Math.max(eggBreak, eggNotBreak) + 1);

            if (eggBreak > eggNotBreak) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        map.set(key, res);
        return res;
    }
};

自底向上迭代

var superEggDrop = function (k, n) {
    let dp = Array(k + 1)
        .fill(null)
        .map(() => Array(n + 1).fill(Infinity));

    // 初始化边界条件
    for (let i = 0; i <= k; i++) dp[i][0] = 0; // 0 层楼不用实验
    for (let j = 1; j <= n; j++) dp[1][j] = j; // 1 个鸡蛋只能线性试

    // 填充 dp 表格
    for (let i = 2; i <= k; i++) {
        for (let j = 1; j <= n; j++) {
            for (let x = 1; x <= j; x++) {
                dp[i][j] = Math.min(dp[i][j], Math.max(dp[i - 1][x - 1], dp[i][j - x]) + 1);
            }
        }
    }

    return dp[k][n];
};
Last Updated:
Contributors: rosendo
Prev
[88] 合并两个有序数组
Next
958.二叉树的完全性检验