254. Drop Eggs 详细解析

描述
There is a building of n floors. If an egg drops from the k th floor or above, it will break. If it’s dropped from any floor below, it will not break.
You’re given two eggs, Find k while minimize the number of drops for the worst case. Return the number of drops in the worst case.
说明
For n = 10, a naive way to find k is drop egg from 1st floor, 2nd floor … kth floor. But in this worst case (k = 10), you have to drop 10 times.
Notice that you have two eggs, so you can drop at 4th, 7th & 9th floor, in the worst case (for example, k = 9) you have to drop 4 times.
样例
Given n = 10, return 4.
Given n = 100, return 14

翻译:
描述:
有一个n层的大楼,如果一个鸡蛋从k层(包括k层)以上扔,它会破,如果k层 以下,它不会破
你有两个鸡蛋,在最坏情况下用最少次数找到这个k,
说明:
对n层来说:一个方法是从第一层开始扔,那么你需要扔10次,
如果你有两个鸡蛋,那么你扔第4,7,9层,最坏情况下,你只要扔4次就可以了。

设置times为最优次数
解析:
举例子:假如说有10层楼。
1.先从第1层楼开始,那么最坏情况是第10层是鸡蛋破的零界点那么得遍历10次(这种情况只用了一个鸡蛋,想想对不对?这个理解吧?)

2.从第2层开始,那么如果2层破了,那需要拿第二个鸡蛋验证1层会不会破,这种情况只需要验证2次,
如果2层没有破,那么第一个鸡蛋可以继续验证,那么验证第几层呢?假设验证第6层,如果第6层破了,那么只能拿第二个鸡蛋验证从第3层开始验证(因为还剩下一个鸡蛋了,如果直接验证第5层的话,第5层破了,就再也没办法知道第3层是零界点还是第四层是零界点了,所以当剩下一个鸡蛋的时候只能从低到高一层一层验证,没有问题吧?)这种情况的最坏是第4层才破下,那么我们验证了第2层,6层,3层,4层,5层 5次,
那么回到开始,为什么从第2层开始验证呢?如果最大次数是5次,那么第一步可以直接验证第5层,
有没有感觉出来一点什么?:就是要最大化利用这个次数,尽量让每一种可能都接近这个最大化次数,那么是不是可以最快知道我们想要的那个零界点
3.现在试试5次,第一次第一个鸡蛋从5层开始,如果破了,那么第二个鸡蛋从1,2,3,4分别扔,这种是5次,
如果没有破,那么第二次第一个鸡蛋从9层开始扔(为什么呢,因为我们已经用了一次机会了,前面得出结论,要让每一次测试都最大化这个次数,这样才能测试最多的楼层,最快得出答案),如果9层破了,那么第二个鸡蛋从6,7,8扔,一共扔了(5,9,6,7,8)5次
这个时候我们已经发现规律了(即第一个鸡蛋扔一次之后,它下一次能扔的距离比这次少一个距离,而且最好的情况下是第一次扔times(最优次数)层数,第二次扔的层数是(和第一次间隔times - 1):times + (times - 1)…),一直到times-x = 1,即绝对定位到一个位置,这时候到达的层数一定>=最高层。(这种也是每种可能都最大化了这个times的情况)。

最后得到结论 times + (times - 1) + … + 2 + 1 >= n 的时候times为最优次数,

附上java代码:

public class Solution {
    /**
     * @param n: An integer
     * @return: The sum of a and b
     */
    public int dropEggs(int n) {

       long sum = 1;
       int i = 1;
       while(sum < n) {
           i++;
           sum +=i;
       }
       return i;
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值