直接循环就能解决
假设我们最多需要扔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为差的等差数列,可以直接使用等差数列的求和公式:,来代替原式
那么:>=n即可,解得
AC代码:
class Solution {
public:
int twoEggDrop(int n) {
return ceil((sqrt(n*8+1)-1)/2);
}
};