Description
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.
Clarification
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
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.
Example
Given n = 10, return 4.
Given n = 100, return 14.
题目大意
你手里面有两个鸡蛋,对于这两个鸡蛋,有一个相同的临界点,在这个临界点之下扔鸡蛋,鸡蛋不会碎,如果在这个临界点之上扔鸡蛋,就会碎掉(碎掉之后这个鸡蛋就不能再扔了),问至少需要多少次的尝试,才能找到这个临界点
Code
public class Solution {
/**
* @param n an integer
* @return an integer
*/
public int dropEggs(int n) {
long ans = 0;
for (int i = 1; ; ++i) {
ans += (long)i;
if (ans >= (long)n)
return i;
}
}
}
详解:
最坏情况就是指找到答案需要扔的最多次数
- 首先,我们有两个鸡蛋,那么第一个鸡蛋一定是按照一定的间距来扔的,通过第一个鸡蛋找到的间距中再一个一个的试过去。
举个例子,假如当前我们要解决的问题是100层楼,那么假如我们一开始按照10作为间距的话,如果n是9的话,我们就要扔一次第一个鸡蛋,扔9次第二个鸡蛋,也就是需要10次,但这个明显不是最坏的情况,如果n是99的话,我们就需要扔10次第一个鸡蛋,扔9次第二个鸡蛋,那么需要19次。这种情况就是最坏的情况,现在再反过来想,我们一开始以10作为间距真的是最优的解吗,很明显如果我们是以等间距扔第一个鸡蛋的话我们每一个区间的最坏查询情况都是不相等的,最坏的查询情况肯定是最后一个区间的最后一个数。
- 那么再想,如果我们能够让每一个区间的最坏查询次数都相等的话,最坏的查询就能够达到最优的方案,那么怎么才能达到这个条件呢。
仔细思考,查询到第二个区间的时候已经扔了一次第一个鸡蛋了,查询到第x个区间的时候已经扔了x-1次第一个鸡蛋了,所以显然如果我们等间距的话我们每一个区间的查询都要比前面一个区间多1次,所以我们可以每过一个区间把区间长度-1,这样就能够达到最佳的方案。
那么最大的那个区间怎么进行计算呢?
其实到这一步不难发现,这个最大区间就是我们要求的最坏的情况的查询数了。
n + (n-1) + (n-2)…… + 1 = N。
这样我们就可以用简单的循环来求得这个n。