Description:
有n层的楼,有两个强度相同的瓶子,设计一个办法来检测该种瓶子的可以承受的最高楼层。
如果,瓶子从第x楼扔下后不会碎,从第x+1层扔下来之后碎了,则其最高承受楼层为x。瓶子不碎的话可以捡起来继续扔。
方法1:
interview时临时想起的,脑子中冒出来了快慢指针的思想,于是想出来该种方法,思路是对的,但是不是最好的。 见多识广的重要性阿。
记瓶子的最高承受层为Max;
每隔两层扔一次,例如,第一个瓶子从1层扔,第二个瓶子从4层扔,有以下结果:
#第1瓶子碎了,则Max=1
#第1瓶子没碎,第2个瓶子碎了,则,Max=2或3,再扔一次检测这两层即可;
#第1瓶子没碎,第2个瓶子没碎,则,从第7层开始扔;
最差时间复杂度: n/4 *2 +1 --->o(n)
方法2:
先扔一个瓶子,从底层往上, 每隔 n^(1/2),扔一次,如果某次扔下后碎了,则开始用另一个瓶子来检测n^(1/2)个楼层即可。
举例:
n=100, n^(1/2)=10, 最坏情况是,先扔9次,10层,20层,... , 100层, 到100层时才碎,然后,用另一个瓶子检测91-99这几个楼层,即从第91层开始扔,最坏是扔到99层才碎。 则共扔了10+9次。
时间复杂度:
n / ( n^(1/2) ) + n^(1/2) -1 = 2 * n^(1/2) - 1 ------->o(n^(1/2))