LeetCode887题:鸡蛋掉落——动态规划法与数学法
1. 问题介绍
关于临界楼层查找问题的最优查找策略,我已经在上一篇博客摔玻璃球(鸡蛋)查找临界楼层中做了详细讲解,本文将继续研究相关问题。
假如题目不要求给出具体的最优查找策略,只问最坏情况下至少需要多少次查找,那么该如何求解呢?LeetCode887题:鸡蛋掉落也提出了相同的问题。
2. 方法研究
为叙述方便,定义如下变量或函数:玻璃球个数 N N N,玻璃球摔碎个数 N b N_b Nb,查找楼层数 F F F,临界楼层 F c F_c Fc,最大查找次数 T T T, N N N和 T T T确定时可查找的最大楼层数 F M a x F_{Max} FMax, F M a x F_{Max} FMax与 N N N和 T T T的函数关系 f f f( N N N, T T T),查找路径 P P P。
最坏情况下的查找次数即为最大查找次数 T T T,在摔玻璃球(鸡蛋)查找临界楼层中, T T T为二叉查找树的深度,假如构造出二叉查找树即可求出 T T T的值。但如果不构造二叉查找树能不能求 T T T的值呢?
2.1 动态规划法
根据定义, N N N, F F F和 T T T满足如下关系: f f f( N N N, T T T- 1 1 1)< F F F≤ f f f( N N N, T T T),假如能推导出 f f f( N N N, T T T)的公式,然后将 T T T=1, 2, 3, … 依次代入关系式中,使关系式成立的 T T T即为所求。
按照动态规划思想推导 f f f( N N N, T T T)函数的递推公式:
- 当 N N N= 1 1 1时,只能从第1层开始向上逐层查找,因此有几次查找机会,最多就能查找几个楼层,即 f f f( 1 1 1, T T T)= T T T;
- 当 T T T= 1 1 1时,不管有几个玻璃球,只有1次查找机会时,最多只能查找1个楼层,即 f f f( N N N, 1 1 1)= 1 1 1;
- 当 N N N> 1 1 1, T T T> 1 1 1时,第1个玻璃球在某层查找,若摔碎,则用第2个玻璃球查找该层下方楼层,最多可查 f f f( N N N- 1 1 1, T T T- 1 1 1)个楼层,若没碎,则继续查找该层上方楼层,最多可查 f f f( N N N, T T T- 1 1 1)个楼层,一共最多可查楼层数为下方楼层加上方楼层再加当前所在层: f f f( N N N, T T T)= f f f( N N N- 1 1 1, T T T- 1 1 1)+ f f f( N N N, T T T- 1 1 1)+ 1 1 1。同理可继续拆分 f f f( N N N- 1 1 1, T T T- 1 1 1)和 f f f( N N N, T T T- 1 1 1),直到 N N N= 1 1 1或 T T T= 1 1 1,即可求得 f f f( N N N, T T T)的值。
综上, f f f( N N N, T T T)的递推公式为:
f ( N , T ) = f ( N − 1 , T − 1 ) + f ( N , T − 1 ) + 1 f(N,T)=f(N-1,T-1)+f(N,T-1)+1 f(N,T)=f(N−1,T−1)+f(N,T−1)+1 ( N ≥ 2 , T ≥ 2 ) (N≥2, T≥2) (N≥2,T≥2)
初始条件为:
f ( 1 , T ) = T , f(1,T)=T, f(1,T)=T, f ( N , 1 ) = 1 f(N,1)=1 f(N,1)=1 ( N = 1 (N=1 (N=1 或 T = 1 ) T=1) T=1)
根据 f ( N , T ) f(N,T) f(N,T)递推公式计算可得 N N N, T T T与 F M a x F_{Max} FMax的数值对照表,如表1所示。已知 N N N和 F F F,查表可得最大查找次数 T T T。
表1. N N N, T T T, F M a x F_{Max} FMax数值对照表
N / T N/T N/T | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | … | 99 | 100 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | … | 99 | 100 |
2 | 1 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | 66 | 78 | 91 | 105 | … | 4950 | 5050 |
3 | 1 | 3 | 7 | 14 | 25 | 41 | 63 | 92 | 129 | 175 | 231 | 298 | 377 | 469 | … | … | … |
4 | 1 | 3 | 7 | 15 | 30 | 56 | 98 | 162 | 255 | 385 | 561 | 793 | 1092 | 1470 | … | … | … |
5 | 1 | 3 | 7 | 15 | 31 | 62 | 119 | 218 | 381 | 637 | 1023 | 1585 | 2379 | 3472 | … | … | … |
6 | 1 | 3 | 7 | 15 | 31 | 63 | 126 | 246 | 465 | 847 | 1485 | 2509 | 4095 | 6475 | … | … | … |
7 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 254 | 501 | 967 | 1815 | 3301 | 5811 | 9907 | … | … | … |
8 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 510 | 1012 | 1980 | 3796 | 7098 | 12910 | … | … | … |
9 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1022 | 2035 | 4016 | 7813 | 14912 | … | … | … |
根据表1分别绘制 N N N取不同值(1, 2, 3, 4, 5, + ∞ ∞ ∞)时的 F M a x F_{Max} FMax- T T T函数图像,其中 T T T=1, 2, 3, …, 50,如图1所示。当 N N N=+ ∞ ∞ ∞时, F M a x F_{Max} FMax= 2 T 2^T 2T- 1 1 1。
图1. F M a x F_{Max} FMax- T T T函数图像
2.2 数学法
利用 f f f( N N N, T T T)的递推公式计算 F M a x F_{Max} FMax的值需要递归计算若干子问题的解,这样未免太过繁琐,如果能推导出 f f f( N N N, T T T)的通项公式,然后将 N N N和 T T T代入公式直接求出 F M a x F_{Max} FMax,就会极大地减少计算量。
2.2.1 f(N, T)的前T项和与组合数公式
因为 N N N表示玻璃球数量, T T T表示最大查找次数,所以 N N N和 T T T均为正整数。
- 当 N N N≥ 2 2 2, T T T≥ 2 2 2时:
设 f ( N , T ) f(N,T) f(N,T)的前 T T T项和为 s ( N , T ) s(N,T) s(N,T),则有
f ( N , T ) = f ( N − 1 , T − 1 ) + f ( N , T − 1 ) + 1 f(N,T)=f(N-1,T-1)+f(N,T-1)+1 f(N,T)=f(N−1,T−1)+f(N,T−1)+1
= f ( N − 1 , T − 1 ) + f ( N − 1 , T − 2 ) + f ( N , T − 2 ) + 1 + 1 =f(N-1,T-1)+f(N-1,T-2)+f(N,T-2)+1+1 =f(N−1,T−1)+f(N−1,T−2)+f(N,T−2)+1+1
= f ( N − 1 , T − 1 ) + f ( N − 1 , T − 2 ) + f ( N − 1 , T − 3 ) + f ( N , T − 3 ) + 1 + 1 + 1 =f(N-1,T-1)+f(N-1,T-2)+f(N-1,T-3)+f(N,T-3)+1+1+1 =f(N−1,T−1)+f(N−1,T−2)+f(N−1,T−3)+f(N,T−3)+1+1+1
= f ( N − 1 , T − 1 ) + f ( N − 1 , T − 2 ) + f ( N − 1 , T − 3 ) + ⋯ + f ( N − 1 , 1 ) + f ( N , 1 ) + =f(N-1,T-1)+f(N-1,T-2)+f(N-1,T-3)+⋯+f(N-1,1)+f(N,1)+ =f(N−1,T−1)+f(N−1,T−2)+f(N−1,T−3)+⋯+f(N−1,1)+f(N,1)+
1 + ⋯ + 1 + 1 + 1 1+⋯+1+1+1 1+⋯+1+1+1
= s ( N − 1 , T − 1 ) + T =s(N-1,T-1)+T =s(N−1,T−1)+T - 当 N N N= 1 1 1时:
f ( 1 , T ) = T = T ! 1 ! ( T − 1 ) ! = C T 1 f(1,T)=T=\frac{T!}{1!(T-1)!}=C_T^1 f(1,T)=T=1!(T−1)!T!=CT1
s ( 1 , T ) = 1 2 T ( T + 1 ) s(1,T)=\frac{1}{2}T(T+1) s(1,T)=21T(T+1) - 当 N N N= 2 2 2时:
f ( 2 , T ) = s ( 1 , T − 1 ) + T = 1 2 ( T − 1 ) T + T = T ! 2 ! ( T − 2 ) ! + T ! 1 ! ( T − 1 ) ! = C T 2 + C T 1 f(2,T)=s(1,T-1)+T=\frac{1}{2}(T-1)T+T=\frac{T!}{2!(T-2)!}+\frac{T!}{1!(T-1)!}=C_T^2+C_T^1 f(2,T)=s(1,T−1)+T=21(T−1)T+T=2!(T−2)!T!+1!(T−1)!T!=CT2+CT1
s ( 2 , T ) = 1 2 × 3 ( T − 1 ) T ( T + 1 ) + 1 2 T ( T + 1 ) s(2,T)=\frac{1}{2×3}(T-1)T(T+1)+\frac{1}{2}T(T+1) s(2,T)=2×31(T−1)T(T+1)+21T(T+1) - 当 N N N= 3 3 3时:
f ( 3 , T ) = s ( 2 , T − 1 ) + T f(3,T)=s(2,T-1)+T f(3,T)=s(2,T−1)+T
= 1 2 × 3 ( T − 2 ) ( T − 1 ) T + 1 2 ( T − 1 ) T + T =\frac{1}{2×3}(T-2)(T-1)T+\frac{1}{2}(T-1)T+T =2×31(T−2)(T−1)T+21(T−1)T+T
= T ! 3 ! ( T − 3 ) ! + T ! 2 ! ( T − 2 ) ! + T ! 1 ! ( T − 1 ) ! =\frac{T!}{3!(T-3)!}+\frac{T!}{2!(T-2)!}+\frac{T!}{1!(T-1)!} =3!(T−3)!T!+2!(T−2)!T!+1!(T−1)!T!
= C T 3 + C T 2 + C T 1 =C_T^3+C_T^2+C_T^1 =CT3+CT2+CT1 - 归纳可得:
f ( N , T ) = s ( N − 1 , T − 1 ) + T f(N,T)=s(N-1,T-1)+T f(N,T)=s(N−1,T−1)+T
= 1 1 × 2 × . . . × N ( T + 1 − N ) ( T + 2 − N ) . . . T + 1 1 × 2 × . . . × ( N − 1 ) ( T + 2 − N ) =\frac{1}{1×2×...×N}(T+1-N)(T+2-N)...T+\frac{1}{1×2×...×(N-1)}(T+2-N) =1×2×...×N1(T+1−N)(T+2−N)...T+1×2×...×(N−1)1(T+2−N)
( T + 3 − N ) . . . T + . . . + 1 2 ( T − 1 ) T + T (T+3-N)...T+...+\frac{1}{2}(T-1)T+T (T+3−N)...T+...+21(T−1)T+T ( N > 0 , T > 0 ) (N>0, T>0) (N>0,T>0) (式1)
= ∑ k = 1 N T ! k ! ( T − k ) ! =\sum_{k=1}^{N}\frac{T!}{k!(T-k)!} =∑k=1Nk!(T−k)!T! ( 0 < N ≤ T ) (0<N≤T) (0<N≤T) (式2)
= ∑ k = 1 N C T k =\sum_{k=1}^{N}C_T^k =∑k=1NCTk ( 0 < N ≤ T ) (0<N≤T) (0<N≤T) (式3)
f ( N , T ) f(N,T) f(N,T)表达式有式1、式2、式3三种形式。式1适用于 N N N> 0 0 0且 T T T> 0 0 0的情况,由于式2用到了阶乘,式3用到了组合数,所以式2和式3只适用于 0 0 0< N N N≤ T T T的情况。
当 N N N≥ T T T> 0 0 0时, T T T次查找机会最多只能用到 T T T个玻璃球,因此:
f ( N , T ) = f ( T , T ) = ∑ k = 1 T C T k = 2 T − 1 f(N,T)=f(T,T)=\sum_{k=1}^{T}C_T^k=2^T-1 f(N,T)=f(T,T)=∑k=1TCTk=2T−1 ( N ≥ T > 0 ) (N≥T>0) (N≥T>0) - 综上, f ( N , T ) f(N,T) f(N,T)的通项公式为:
f ( N , T ) = { ∑ k = 1 N C T k , 0<N≤T 2 T − 1 , N≥T>0 f(N,T)=\begin{cases}\displaystyle\sum_{k=1}^{N}C_T^k, &\text{0<N≤T}\\2^T-1,&\text{N≥T>0}\end{cases} f(N,T)=⎩ ⎨ ⎧k=1∑NCTk,2T−1,0<N≤TN≥T>0
2.2.2 杨辉三角与裂项相消
根据函数 f ( N , T ) f(N, T) f(N,T)的定义可得: N N N和 T T T也可以取值为0,因此 f ( N , T ) f(N, T) f(N,T)递推公式的初始条件为:
f ( 0 , T ) = 0 f(0, T)=0 f(0,T)=0, f ( N , 0 ) = 0 f(N, 0)=0 f(N,0)=0, f ( 1 , T ) = T f(1, T)=T f(1,T)=T, f ( N , 1 ) = 1 f(N, 1)=1 f(N,1)=1
f ( N , T ) f(N, T) f(N,T)的递推公式:
f ( N , T ) = f ( N − 1 , T − 1 ) + f ( N , T − 1 ) + 1 f(N, T)=f(N-1, T-1)+f(N, T-1)+1 f(N,T)=f(N−1,T−1)+f(N,T−1)+1 ( N ≥ 1 , T ≥ 1 ) (N≥1, T≥1) (N≥1,T≥1) (式4)
由式4可得:
f ( N − 1 , T ) = f ( N − 2 , T − 1 ) + f ( N − 1 , T − 1 ) + 1 f(N-1, T)=f(N-2, T-1)+f(N-1, T-1)+1 f(N−1,T)=f(N−2,T−1)+f(N−1,T−1)+1 ( N ≥ 2 , T ≥ 1 ) (N≥2, T≥1) (N≥2,T≥1) (式5)
式4 − - −式5,可得:
f ( N , T ) − f ( N − 1 , T ) = ( f ( N − 1 , T − 1 ) − f ( N − 2 , T − 1 ) ) f(N, T)-f(N-1, T)=(f(N-1, T-1)-f(N-2, T-1)) f(N,T)−f(N−1,T)=(f(N−1,T−1)−f(N−2,T−1))
+ ( f ( N , T − 1 ) − f ( N − 1 , T − 1 ) ) +(f(N, T-1)-f(N-1, T-1)) +(f(N,T−1)−f(N−1,T−1)) (式6)
令 g ( N , T ) = f ( N , T ) − f ( N − 1 , T ) g(N, T)=f(N, T)-f(N-1, T) g(N,T)=f(N,T)−f(N−1,T) (式7)
由式6、式7可得:
g ( N , T ) = g ( N − 1 , T − 1 ) + g ( N , T − 1 ) g(N, T)=g(N-1, T-1)+g(N, T-1) g(N,T)=g(N−1,T−1)+g(N,T−1) ( N ≥ 2 , T ≥ 1 ) (N≥2, T≥1) (N≥2,T≥1) (式8)
式8为杨辉三角(二项式系数)的递推公式,由此可得:
g ( N , T ) = C T N g(N, T)=C_T^N g(N,T)=CTN ( N ≥ 2 , T ≥ 2 ) (N≥2, T≥2) (N≥2,T≥2) (式9)
将 N N N=1分别代入式7和式9:
g ( 1 , T ) = f ( 1 , T ) − f ( 0 , T ) = T − 0 = T g(1, T)=f(1, T)-f(0, T)=T-0=T g(1,T)=f(1,T)−f(0,T)=T−0=T
g ( 1 , T ) = C T 1 = T g(1, T)=C_T^1=T g(1,T)=CT1=T
两式结果相等,说明当 N N N=1时,式9也成立。
使用裂项相消法:
g ( N , T ) = f ( N , T ) − f ( N − 1 , T ) g(N, T)=f(N, T)-f(N-1, T) g(N,T)=f(N,T)−f(N−1,T)
g ( N − 1 , T ) = f ( N − 1 , T ) − f ( N − 2 , T ) g(N-1, T)=f(N-1, T)-f(N-2, T) g(N−1,T)=f(N−1,T)−f(N−2,T)
g ( N − 2 , T ) = f ( N − 2 , T ) − f ( N − 3 , T ) g(N-2, T)=f(N-2, T)-f(N-3, T) g(N−2,T)=f(N−2,T)−f(N−3,T)
…
g ( 2 , T ) = f ( 2 , T ) − f ( 1 , T ) g(2, T)=f(2, T)-f(1, T) g(2,T)=f(2,T)−f(1,T)
g ( 1 , T ) = f ( 1 , T ) − f ( 0 , T ) g(1, T)=f(1, T)-f(0, T) g(1,T)=f(1,T)−f(0,T)
可得:
f ( N , T ) = ∑ k = 1 N C T k f(N, T)=\sum_{k=1}^{N}C_T^k f(N,T)=∑k=1NCTk ( 0 < N ≤ T ) (0<N≤T) (0<N≤T)
当 N N N≥ T T T> 0 0 0时:
f ( N , T ) = 2 T − 1 f(N, T)=2^T-1 f(N,T)=2T−1 ( N ≥ T > 0 ) (N≥T>0) (N≥T>0)
2.2.2所得 f ( N , T ) f(N,T) f(N,T)通项公式与2.2.1相同。
2.2.3 逆向推理与组合数含义
当 N N N= 3 3 3, T T T= 4 4 4时, F M a x F_{Max} FMax= f f f( 3 3 3, 4 4 4)= 14 14 14, N b N_b Nb可能取值为1, 2, 3,二叉查找树如图2所示。根据图2可得 F c F_c Fc取不同值时对应的查找路径 P P P,见表2。表2分析了 F M a x F_{Max} FMax与 N b N_b Nb的关系,其中查找次序对应玻璃球序号一栏中加下划线的数字表示该玻璃球摔碎。
图2. 当 N N N=3, F F F=14时的二叉查找树
表2. F M a x F_{Max} FMax与 N b N_b Nb关系分析表
临界楼层 F c F_c Fc | 查找路径 P P P |
查找次序对应玻璃球序号 1 2 3 4 |
N b N_b Nb与对应 F c F_c Fc数量 F N b F_{N_b} FNb的关系 | 组合数含义 |
---|---|---|---|---|
7 11 13 14 |
7 3 5 6 7 11 9 10 7 11 13 12 7 11 13 14 |
1 2 2 2 1 1 2 2 1 1 1 2 1 1 1 1 |
N b = 1 N_b=1 Nb=1 F 1 = C 4 1 = 4 F_1=C_4^1=4 F1=C41=4 |
C 4 1 C_4^1 C41:从4次查找机会中选择有球摔碎的1次,共有4种组合。 |
3 5 6 9 10 12 |
7 3 1 2 7 3 5 4 7 3 5 6 7 11 9 8 7 11 9 10 7 11 13 12 |
1 2 3 3 1 2 2 3 1 2 2 2 1 1 2 3 1 1 2 2 1 1 1 2 |
N b = 2 N_b=2 Nb=2 F 2 = C 4 2 = 6 F_2=C_4^2=6 F2=C42=6 |
C 4 2 C_4^2 C42:从4次查找机会中选择有球摔碎的2次,共有6种组合。 |
1 2 4 8 |
7 3 1 7 3 1 2 7 3 5 4 7 11 9 8 |
1 2 3 1 2 3 3 1 2 2 3 1 1 2 3 |
N b = 3 N_b=3 Nb=3 F 3 = C 4 3 = 4 F_3=C_4^3=4 F3=C43=4 |
C 4 3 C_4^3 C43:从4次查找机会中选择有球摔碎的3次,共有4种组合。 |
由表2可得:
F M a x = F 1 + F 2 + F 3 = C 4 1 + C 4 2 + C 4 3 = 4 + 6 + 4 = 14 F_{Max}=F_1+F_2+F_3=C_4^1+C_4^2+C_4^3=4+6+4=14 FMax=F1+F2+F3=C41+C42+C43=4+6+4=14
推广到一般情况,当 0 0 0< N N N≤ T T T时:
F M a x = f ( N , T ) = ∑ N b = 1 N F N b = ∑ N b = 1 N C T N b F_{Max}=f(N,T)=\sum_{N_b=1}^NF_{N_b}=\sum_{N_b=1}^NC_T^{N_b} FMax=f(N,T)=∑Nb=1NFNb=∑Nb=1NCTNb ( 0 < N ≤ T ) (0<N≤T) (0<N≤T)
当 N N N≥ T T T> 0 0 0时:
F M a x = f ( N , T ) = 2 T − 1 F_{Max}=f(N,T)=2^T-1 FMax=f(N,T)=2T−1 ( N ≥ T > 0 ) (N≥T>0) (N≥T>0)
2.2.3所得 f ( N , T ) f(N,T) f(N,T)通项公式与2.2.1相同。
LeetCode887题:鸡蛋掉落的官方题解称其方法三为数学法,但实际上与本文的动态规划法相同,所以从狭义上来讲该方法还是属于计算机专业的范畴,而本文的数学法则利用了数列的前n项和公式、组合数公式、杨辉三角(二项式系数)以及裂项相消等数学知识点,因此称其为数学法更为合理贴切。
3. Python代码实现
import mathdef max_floors_number_recursive_formula(balls_number, search_times):dp = [[0]*(search_times+1) for _ in range(balls_number+1)]for i in range(1, search_times+1):dp[1][i] = ifor i in range(1, balls_number+1):dp[i][1] = 1for i in range(2, balls_number+1):for j in range(2, search_times+1):dp[i][j] = dp[i-1][j-1] + dp[i][j-1] + 1return dp[balls_number][search_times]def max_floors_number_general_formula(balls_number, search_times):if balls_number < search_times:combination, max_floors_number = 1, 0for k in range(1, balls_number+1):combination *= search_times - k + 1combination /= kmax_floors_number += combinationreturn max_floors_numberreturn (1 << search_times) - 1def maximum_search_times(balls_number, floors_number):max_floors_number = 0search_times = math.ceil(math.log2(floors_number+1)) - 1while max_floors_number < floors_number:search_times += 1max_floors_number = max_floors_number_general_formula(balls_number, search_times)return search_timesprint(maximum_search_times(1, 100))
print(maximum_search_times(2, 100))
print(maximum_search_times(3, 100))
print(maximum_search_times(4, 100))
print(maximum_search_times(5, 100))
实验结果:
100
14
9
8
7
代码解读:
函数max_floors_number_recursive_formula采用递推公式计算 F M a x F_{Max} FMax,通过非递归方式实现。因为递归方式会重复计算子问题导致时间复杂度较高,而非递归方式通过存储子问题的解,避免了重复计算,因此时间复杂度较低。
函数max_floors_number_general_formula采用通项公式计算 F M a x F_{Max} FMax。对于公式中的 C T k C_T^k CTk可按规律 C T k = C T k − 1 × ( T − k + 1 ) / k , ( 0 < k ≤ N ) C_T^k=C_T^{k-1}×(T-k+1)/k, (0<k≤N) CTk=CTk−1×(T−k+1)/k,(0<k≤N)进行计算,推导过程如下:
C T 0 = 1 C_T^0=1 CT0=1
C T 1 = 1 × T 1 = C T 0 × ( T − 1 ‾ + 1 ) / 1 ‾ C_T^1=\frac{1×T}{1}=C_T^0×(T-\underline1+1)/\underline1 CT1=11×T=CT0×(T−1+1)/1
C T 2 = 1 × T × ( T − 1 ) 2 × 1 = C T 1 × ( T − 2 ‾ + 1 ) / 2 ‾ C_T^2=\frac{1×T×(T-1)}{2×1}=C_T^1×(T-\underline2+1)/\underline2 CT2=2×11×T×(T−1)=CT1×(T−2+1)/2
…
C T N = 1 × T × ( T − 1 ) × . . . × ( T − N + 1 ) N × ( N − 1 ) × . . . × 1 = C T N − 1 × ( T − N ‾ + 1 ) / N ‾ C_T^N=\frac{1×T×(T-1)×...×(T-N+1)}{N×(N-1)×...×1}=C_T^{N-1}×(T-\underline{N}+1)/\underline{N} CTN=N×(N−1)×...×11×T×(T−1)×...×(T−N+1)=CTN−1×(T−N+1)/N
函数maximum_search_times用来求解最大查找次数 T T T。基本思路如下: N N N为已知数,令 T T T依次取1, 2, 3, …,然后将 N N N, T T T代入 f f f( N N N, T T T)的公式中,使不等式 f f f( N N N, T T T- 1 1 1)< F F F≤ f f f( N N N, T T T)成立的 T T T即为所求。
接下来对基本思路进行优化, T T T一定要从1开始取值吗?由图1可知,当 F F F一定时, N N N越大, T T T越小。当 N N N无限时, T T T值最小,解不等式 f f f( N N N, T T T)= 2 T 2^T 2T- 1 1 1≥ F F F可得 T T T≥ l o g 2 log_2 log2( F F F+ 1 1 1),因为 T T T是整数,所以 T M i n T_{Min} TMin= ⌈ l o g 2 ⌈log_2 ⌈log2( F F F+ 1 1 1) ⌉ ⌉ ⌉。而当 N N N有限时, T T T≥ T M i n T_{Min} TMin,因此 T T T从 T M i n T_{Min} TMin开始取值即可。
4. 参考文献
[1] lzshlzsh. [百度面试题]100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层. (2010)
https://blog.csdn.net/lzshlzsh/article/details/5951447
[2] halfrost. How to improve algorithm skills LeetCode Cookbook.
LeetCode887题:鸡蛋掉落——动态规划法与数学法相关推荐
- [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]
[问题描述] [887. 鸡蛋掉落] 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去.你知道存在楼层 F ,满足 ...
- LeetCode887之鸡蛋掉落(相关话题:动态规划,二分法)
前言 但是这道题的解法技巧很多,光动态规划就好几种效率不同的思路,最后还有一种极其高效数学解法.秉承咱们号一贯的作风,拒绝奇技淫巧,拒绝过于诡异的技巧,因为这些技巧无法举一反三,学了不太划算 问题描述 ...
- LeetCode887题:鸡蛋掉落——官方题解方法一、二详解
关于LeetCode887题:鸡蛋掉落的解法,我在LeetCode887题:鸡蛋掉落--动态规划法与数学法中已经讲得很清楚了,但其官方题解中有新的解法,本文将对其方法一和方法二进行解读. 首先定义变量 ...
- 装鸡蛋的鞋子java代码_Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)...
887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- LeetCode887. 鸡蛋掉落
887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- 算法题:鸡蛋掉落(leetcode 887题)
题目: 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- 每日一题 11.4 鸡蛋掉落
每日一题 11.4 鸡蛋掉落 一.题目概述 这是一道困难题,难度肯定是比前三天的要大的,这个毋庸置疑,但是毕竟趣味性在这里摆着,和昨天那个相比,钻研这个的兴趣要更大一点,昨天那个并查集和哈希表实在是太 ...
- dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题
dp 扔鸡蛋 Problem statement: You are given N floor and K eggs. You have to minimize the number of times ...
- 【leetcode】鸡蛋掉落问题
在leetcode刷动态规划问题过程中,鸡蛋掉落问题是比较经典的,特别是笔试面试喜欢出的问题.腾讯,Vivo等大厂都出现过,在这里通过自己学习,以及借鉴大佬的思路,对这道题进行整理. 其它算法问题刷题 ...
最新文章
- 第2次作业+105032014158
- 加密与解密、OpenSSL(SSL/TLS)、OpenSSH(ssh)、dropbear
- 【个人成长学习讨论小组】练习2:角色
- [USACO1.1]坏掉的项链Broken Necklace
- 最新综述:基于Transformer的NLP预训练模型已经发展到何种程度?
- python 如何重定向输出
- MySQL高级 - 锁 - InnoDB行锁 - 间隙锁危害
- JavaFX自定义控件– Nest Thermostat第1部分
- iOS-获取通讯录信息
- apple apns http2 java调用
- 麦克纳姆轮运动特性分析(图片版)
- shell 面试题 (一) 待续
- 最小树——迪杰斯特拉算法
- 海康SDK-javademo实现报错问题解决
- 使用canvas保存网页为pdf文件支持跨域
- 伺服舵机匀加速和匀减速程序控制
- php获取网页内指定内容,PHP中获取某个网页或文件内容的方法
- 观影计划:漫威电影宇宙「无限战争」系列
- Tracup|使用项目管理软件帮助战胜拖延症
- win10环境socks代理实战
热门文章
- [实用超分网络大赏]《Real-Time Quantized Image Super-Resolution on Mobile NPUs, Mobile AI 2021 Challenge》
- 什么是缓冲区溢出?有什么危害?其原因是什么?
- 常用screen命令
- 17-跨语言调用 Google ProtoBuf
- Python+Yolov5反光衣黄色马甲特征识别监测快速锁定目标人物体
- WowLua学习笔记
- 几种点云(网格)孔洞填充方法(1)
- 阿里云服务器用SMTP的25号端口发送邮件问题
- 阿里域名+腾讯云服务器组合部署网站
- Win10+Ubuntu双系统安装教程