码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 887. Super Egg Drop

时间:2020-03-29 13:07:36      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:题目   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 ;
    }
};

  

leetcode 887. Super Egg Drop

标签:题目   int   return   code   cto   drop   leetcode   tor   多少   

原文地址:https://www.cnblogs.com/mychen06/p/12591404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!