返回
鸡蛋多解法:尽享探索解决之道
前端
2024-01-15 22:12:32
鸡蛋掉落问题:给定鸡蛋若干枚、楼层 N、已知鸡蛋从 M 楼层掉下必摔碎, 求最少鸡蛋使之摔碎即可二分得知最低 M 楼层。此解法有动态规划(DP)与二分查找两种,从而能适用更大数据集。
方法一:动态规划
步骤一 :构建二分查找表
f[n][k] := n 楼层 k 鸡蛋最多需要的次数
步骤二 :初始化
f[1][k] = k
f[n][1] = n
步骤三 :求解
for n > 1 and k > 1 :
f[n][k] = min(f[n][k-1], f[n-1][k], f[n-1][k-1] + 1])
步骤四 :求答案
return f[n][k]
方法二:动态规划 + 二分查找
步骤一 :与方法一相同,构建二分查找表
f[n][k] := n 楼层 k 鸡蛋最多需要的次数
步骤二 :与方法一相同,初始化
f[1][k] = k
f[n][1] = n
步骤三 :求解
for n > 1 and k > 1 :
lo = 1
hi = n
while lo <= hi :
mid = lo + (hi - lo) // 2
if f[mid][k-1] + 1 <= f[n][k] :
lo = mid + 1
if f[n][k] <= f[mid][k-1] + 1 :
hi = mid - 1
return lo
实例一
n = 10, k = 3
方法一 :
f[1][k] = 1
f[2][k] = 2
f[3][k] = 3
f[4][k] = 4
f[5][k] = 5
f[6][k] = 6
f[7][k] = 7
f[8][k] = 8
f[9][k] = 9
f[10][k] = 10
f[10][3] = 4
方法二 :
lo = 1
hi = 10
mid = 10 // 2 = 5
f[5][3] = 3
f[10][3] = 4
lo = 6
mid = 6 + 1 = 7
f[7][3] = 4
f[10][3] = 4
lo = 8
mid = 8 + 1 = 9
f[9][3] = 5
f[10][3] = 4
hi = 8
mid = 8 // 2 = 4
f[4][3] = 3
f[10][3] = 4
lo = 5
mid = 5 + 1 = 6
f[6][3] = 3
f[10][3] = 4
hi = 5
mid = 5 // 2 = 2
f[2][3] = 2
f[10][3] = 4
lo = 3
mid = 3 + 1 = 4
f[4][3] = 3
f[10][3] = 4
lo = 5
mid = 5 // 2 = 2
f[2][3] = 2
f[10][3] = 4
hi = 4
mid = 4 // 2 = 2
f[2][3] = 2
f[10][3] = 4
hi = 3
return lo = 5
结论
- 动态规划法时间开销 O(nk),空间开销 O(nk)
- 二分查找法时间开销 O(n),空间开销 O(k)
方法二以动态规划为根,二分查找为枝,是一种优化方法,在鸡蛋和楼层较大时优势显著。