【LintCode】254. 丢鸡蛋

2020-05-11  本文已影响0人  Kean_Qi

楼有 n 层高,鸡蛋若从 k 层或以上扔,就会碎。从 k 层以下扔,就不会碎。
现在给两个鸡蛋,用最少的扔的次数找到 k。返回最坏情况下次数。

【要求】找到x层落下不会碎, x+1层落下会碎的临界层所需要的最少尝试次数 r(r for result)

【假设】

如果大楼100层, 考虑:
k + (k-1) + (k-2)+...+3+2+1 = (k+1)*k/2 =100 =>k ~= 14
所以第一次扔14层, 最坏需要14次(策略不唯一, 树的叶子可以交换位置).
以上是数学做法...当然还有代码做法....
设f(n, m)为n层楼, m个蛋所需次数, 那么它成了一道DP题..

f(0,m) = 0,(m>=1)
f(h,1) = n,(h>=1)
f(h,m) = (1->k->n)min{max{f(k-1,m-1), f(h-k, m)}} + 1
即:


f(h,m) = (1->k->n)min{max{f(k-1,m-1), f(h-k, m)}} + 1.png
public class Solution {
    /**
     *
     * @param n 楼层
     * @return  最坏情况最少的次数
     */
    public int dropEggs(int n){
         long k = 0;
        for (int i = 1; ; ++i) {
            k += (long)i;
            if (k >= (long)n)
                return i;
        }
    }

另外一种暴力方法:

public int dropEggs(int n) {
        long x = n;
        double x1 = (Math.sqrt(x * 8 + 1) - 1) / 2;
        return (int)Math.ceil(x1);
    }
上一篇 下一篇

猜你喜欢

热点阅读