标签:题目 int return code cto drop leetcode tor 多少
题目解析:有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 ;
}
};
标签:题目 int return code cto drop leetcode tor 多少
原文地址:https://www.cnblogs.com/mychen06/p/12591404.html