GuilinDev

Lc1884

05 August 2008

1884 Egg Drop With 2 Eggs and N Floors

两只鸡蛋掉落

1
2
3
4
5
class Solution {
    public int twoEggDrop(int n) {
        return (int) Math.ceil((Math.sqrt(1 + 8 * n) - 1) / 2);
    }
}

此题是887. 鸡蛋掉落的简化版

我们用dp[i][j]表示有(i+1)枚鸡蛋(i从0开始),需要检测j层楼时最少的移动步数 首先我们考虑只有一枚鸡蛋的情况,由于只要一枚鸡蛋,因此我们只能逐层尝试,即从1楼到N楼,那么极限情况最多需要N次 接下来我们考虑两枚鸡蛋去检测j层楼的情况,假设我们在第k(k>0)层楼丢鸡蛋:

如果鸡蛋碎了,那么就转化为一枚鸡蛋去检测K-1层楼的问题 如果鸡蛋没有碎,那么就转化为了两枚鸡蛋去检测j-k层楼的问题 由于我们需要确保能检测出结果,因此需要取上述两个子问题中的较大值 因此dp方程的转化为: dp[0][j] = j dp[1][j] = min(max(dp[0][k-1],dp[1][j-k])+1) 注意:这里加1是因为当前检测需要一次,1<=k<=j

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
    public int twoEggDrop(int floors) {
        int eggs = 2;
        int dp[][] = new int[eggs+1][floors+1];
        int c =0;
        
        for(int i=0; i <= floors; i++){
            dp[1][i] = i;
        }
        
        for(int f = 1; f <=floors; f++){
            dp[2][f] = Integer.MAX_VALUE;
                for(int k = 1; k <=f ; k++){
                    c = 1 + Math.max(dp[1][k-1], dp[2][f-k]); //the egg breaks on current floor or the egg dosen't break on the current floor. Take the worst case
                    if(c < dp[2][f])
                        dp[2][f] = c;
                }
            }
        return dp[eggs][floors];        
    }
}