力扣1884--鸡蛋掉落,两枚鸡蛋 通俗解法,包你看懂

题目链接题目链接

直接循环就能解决

假设我们最多需要扔x次,现在第一枚鸡蛋在x层扔下

这样,如果第一枚碎了,那么f必然在1到x-1层,我们从1楼开始,到2楼、3楼...,一直到x-1楼,每次都扔下第二枚鸡蛋,一旦鸡蛋碎了,那么f就等于让鸡蛋碎的那一层,这样,考虑最差情况,f恰好等于x-1,那么我们最多扔1+x-1次就可以确定f的值,可以满足最多扔x次

如果第一枚鸡蛋没有碎,说明f不在1到x层.那么,我们把第一枚鸡蛋在x+(x-1)楼层处扔下

和上述类似的,此时,我们从x+1楼开始,到x+2楼,x+3楼...一直到x+(x-2)楼,最多要扔2+x-2次

不断重复上述流程,我们最后一次扔的楼层是:x+(x-1)+(x-2)+(x-3)+...

为了保证能得到答案,只需要x+(x-1)+(x-2)+(x-3)+...>=n

为了保证x是最小,需要x+(x-1)+(x-2)+(x-3)+...+1>=n

因为题目的n<=1000,所以从1开始循环遍历x即可,最多只需要遍历到45即可

AC代码:

class Solution {
public:
    int twoEggDrop(int n) {
        int i=1;
        int x=0;
        for(i;;i++){
            x+=i;
            if(x>=n) break;
        }
        return i;
    }
};

这个算法的效率和空间效率都蛮高的,就纯数学推导

当然,可以更快,发现x+(x-1)+(x-2)+(x-3)+...+1就是一个以1为首项,1为差的等差数列,可以直接使用等差数列的求和公式:\frac{x(x+1)}{2},来代替原式

那么:\frac{x(x+1)}{2}>=n即可,解得x\geq \frac{ \sqrt{(8n+1)}-1}{2}

AC代码:

class Solution {
public:
    int twoEggDrop(int n) {
        return ceil((sqrt(n*8+1)-1)/2);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值