887. 鸡蛋掉落

鸡蛋掉落

题目描述:

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。

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

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

请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?

示例 1:

输入:k = 1, n = 2
输出:2
解释:
鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
如果它没碎,那么肯定能得出 f = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。
示例 2:

输入:k = 2, n = 6
输出:3
示例 3:

输入:k = 3, n = 14
输出:4

提示:

1 <= k <= 100
1 <= n <= 104

思路:

时间复杂度:O(k*move),空间复杂度O(k*)

思路为计算移动m部和k个鸡蛋的情况下能预测到最大的楼层数。

代码:

func superEggDrop(k int, n int) int {
    
    dp := make([][]int, 1000)
    for i:=0;i<1000;i++{
        dp[i] = make([]int, k+1)
    }
    move := 1
    for dp[move-1][k] <n{
        for i:=1;i<=k;i++{
            dp[move][i] = 1 + dp[move-1][i-1] + dp[move-1][i]
        }
        move++
    }

    return move-1
}

代码效率:

执行用时:4 ms, 在所有 Go 提交中击败了75.26%的用户
内存消耗:6 MB, 在所有 Go 提交中击败了84.54%的用户