返回

鸡蛋多解法:尽享探索解决之道

前端

鸡蛋掉落问题:给定鸡蛋若干枚、楼层 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)

方法二以动态规划为根,二分查找为枝,是一种优化方法,在鸡蛋和楼层较大时优势显著。