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))