leetcode 887. Super Egg Drop
Posted mychen06
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 887. Super Egg Drop相关的知识,希望对你有一定的参考价值。
题目解析:有k个鸡蛋,N层楼,求最少的moves可以确定F的大小.题目中暗含着1-N是有序的,如果第i层鸡蛋没破,那F值肯定在[i,n]层,如果破了,那F值就在[0,i-1]层;
解法一:求最小值,动态规划;顺着题目想dp[K][N]的最小值,假设在i层扔下,如果鸡蛋破了,那么F肯定[0, i-1]之间,如果没破,那么F肯定在[i , N]之间,所以dp[k][N] = min(1 + max(dp[k-1][i-1] , dp[k][N-i])) ; 时间复杂度为O(KN^2); 为什么不要第i层呢?因为i层已经扔过了,所以未免重复计算,就不再算i层;
解法二:
换个思路想:K个鸡蛋 j 次moves能确定的最大层数是多少?k个鸡蛋j次moves能确定的层数与第几层无关。dp[k][j] = 1 + dp[k-1][j-1] + dp[k][j-1];
class Solution { public: int superEggDrop(int K, int N) { vector<vector<int>> dp(N + 1 , vector<int>(K+1 , 0)) ; for(int i = 1 ; i <= N ; i++) { for(int j = 1 ; j <= K; j++) { dp[i][j] = 1 + dp[i - 1][j - 1] + dp[i - 1][j] ; if(dp[i][j] >= N) { return i ; } } } return N ; } };
解法三:可以将O(N^2)的空间复杂度降为O(N) ;
class Solution { public: int superEggDrop(int K, int N) { vector<int> dp(K + 1 , 0) ; int res = 0 ; while(dp[K] < N) { res++ ; for(int i = K ; i > 0 ; i--) dp[i] += dp[i-1] + 1 ; } return res ; } };
以上是关于leetcode 887. Super Egg Drop的主要内容,如果未能解决你的问题,请参考以下文章
算法: 超级落蛋计算第一次蛋碎的楼层887. Super Egg Drop