经典面试题-扔鸡蛋问题 Leetcode 887. 鸡蛋掉落

很经典的题目,力扣上的链接:887. 鸡蛋掉落

题目大意是:有K个鸡蛋,N层楼,求你找出在最坏情况下最小的尝试次数找出鸡蛋碎的临界楼层。

解析

理解题目建议看看李永乐老师的视频:复工复产找工作?先来看看这道面试题:双蛋问题
如果不限制鸡蛋次数,想找出最少的尝试次数,直接二分区间即可,比如一共8层,第一次看看4层碎不碎,4层不碎,去6层扔…,4层碎了,去2层扔看看碎不碎…
何为最坏情况:鸡蛋破碎一定发生在搜索区间穷尽时,同时也要保证在该种情况下使得尝试次数最少。

现在给了鸡蛋的限制,只有K个,这个时候就不能直接用二分了。比如说只给你 1 个鸡蛋,7 层楼,你敢用二分吗?你直接去第 4 层扔一下,如果鸡蛋没碎还好,但如果碎了你就没有鸡蛋继续测试了,无法确定鸡蛋恰好摔不碎的楼层 F 了。这种情况下只能用线性扫描的方法,算法返回结果应该是 7 [ 1 ] ^{[1]} [1]

其实这样的话,如果使用三分,五分,十分都可以尽可能的减少尝试次数,无法直接找出最优策略,我们可以使用计算进行求解,也就是暴力枚举,在任意一个区间 [ i , j ] [i,j] [i,j],分别尝试从k层扔下鸡蛋,其中 k ∈ [ i , j ] k\in[i,j] k[i,j],慢慢递推,也就是动态规划的思想。

d p [ K ] [ N ] dp[K][N] dp[K][N]表示 K K K个鸡蛋, N N N层楼,找出最坏情况下最少的尝试次数的大小,假设在第i层扔鸡蛋:

  • 如果碎了,此时剩下 K − 1 K-1 K1个鸡蛋,临界就要从下面的 i − 1 i-1 i1层楼里面找,问题就变成了 d p [ K − 1 ] [ i − 1 ] dp[K-1][i-1] dp[K1][i1]
  • 如果没碎,还是有 K K K个鸡蛋,临界就要从上面的 N − i N-i Ni层楼里面找,问题就变成了 d p [ K ] [ N − i ] dp[K][N-i] dp[K][Ni]

无论碎没碎,扔这个鸡蛋我们都尝试了一次,所以最后要加1。
d p [ K ] [ N ] = min ⁡ i ∈ [ 1 , N ] { max ⁡ ( d p [ K − 1 ] [ i − 1 ] , d p [ K ] [ N − i ] ) + 1 } dp[K][N] = \min_{i\in[1,N]}\{ \max(dp[K-1][i-1],dp[K][N-i])+1\} dp[K][N]=i[1,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值