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%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!