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的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 887. Super Egg Drop

算法: 超级落蛋计算第一次蛋碎的楼层887. Super Egg Drop

算法: 超级落蛋计算第一次蛋碎的楼层887. Super Egg Drop

Super Egg Drop

[LeetCode] 887. 鸡蛋掉落

LeetCode887鸡蛋掉落——dp