假如有100層樓,總共有2個雞蛋。需要多少次才能試探出臨界點,比如,在第三層扔下去,不碎;在第四層扔下去,碎了,那第三層和第四層就是臨界點。
如果之前沒準備過的話,大概第乙個想到的就是二分法。
1. 二分法
首先在第50層丟第乙個雞蛋,若雞蛋碎了,則在第一層開始往上丟雞蛋,最壞情況是試探49+1次,為什麼要從第一層開始嘗試呢,因為只有2個雞蛋;若雞蛋沒碎,則在75層丟第二次,若碎了則在(50,75)區間從下往上嘗試。。。
結論:二分法最壞嘗試次數是50次。
顯然二分法不是乙個好的解決方案,這裡介紹第二種方法「平方根法」。
2. 平方根法
因為100是10的平方,我們可以把10作為乙個區間去嘗試,即第一層在第10層丟,碎了,則需在[1,9]之間嘗試;不碎,則去第20層丟。。。,一直到第90層丟,還不碎的話,則在[91,100]層逐一嘗試,最壞情況是9+10=19次,19次了,比二分法要前進了一半以上了。並且平方根法還可以再優化一下:以15層作為起點,步伐是10。即第一層是15,第二次是25,第三次是35,45…95。這種優化後的呢,最壞情況下,是在第9次(第95層碎),然後在(85,95)區間嘗試9次,即優化後的最壞嘗試次數是9+9=18次。
結論:平方根法最壞情況下是19次,平方根優化法最壞情況下是18次。
3.解方程法
這裡介紹下解方程法,演算法的思想呢是假設最優解是x次,第一次扔的樓層也是x層。為什麼第一層扔的樓層也要是x層呢?因為如果最優解成立
②當第一次扔的樓層是x-1層時,若碎了,則需要在[1,x-2]層裡依次嘗試,最快情況是在x-2層碎,即嘗試總次數是:1+x-2=x-1次,和假設不符;同理,第一次在x-1層下面的話,總次數只會更少
綜上所述,假設最優解是x次時,第一層扔的樓層也得是x層。
開始扔雞蛋了
第一次是在x層扔雞蛋,結果也就兩種情況:蛋碎,蛋不碎
蛋碎了,那麼加下來只需在[1,x-1]之間扔雞蛋即可,最壞需要x-1次,總次數即1+x-1=x次
蛋不碎第二次得在(x,100]區間內扔雞蛋了,具體是哪乙個層呢?應該是在x層上的x-1層。為什麼是x-1層呢?因為[1,100]區間,嘗試次數是x次,在x層不碎,則問題轉化成了在(x,100]層,最優解是x-1次,同理,扔雞蛋的最優樓層數也得是x層上的x-1層。
第三次得再加x-2層扔
第四次得再加x-3層扔
以此類推…
轉化成方程式是: x + (x-1) + (x-2) + (x-3) + … + 2 + 1 = 100,左邊的都能理解,右邊的為什麼是100呢?因為樓層是100層,方程式的左邊肯定小於等於100,取最壞情況那就是方程式右邊是100。
根據等差數列求和公式sn=n(a1+an)/2 ,x向上取整得14,即第一次在14層扔,第二次是在 14+(14-1)=27層,後面依次是39,50,60,69,77,84,90,95,99,100
所以嘗試的最優解為
14,27,39,50,60,69,77,84,90,95,99,100
按照這種辦法嘗試,無論哪種情況下,我們的最壞嘗試次數都不會超過14次
舉例1:在14層碎了,我們只需嘗試[1,13]層之間,每層扔一下即可,最壞情況在13層才碎,也就是一共嘗試14次
舉例2:前面都沒碎,在39層碎了,那麼我們需要在(27,38]層之間,每層扔一下即可,最壞情況在38層才碎,也就是一共嘗試前面3次(14,27,39層)+後面11次=14次
舉例3:前面都沒碎,在99層碎了,那麼我們需要在(95,98]層之間,每層扔一下即可,最壞情況在98層才碎,也就是一共嘗試了前面11次(14,27,39,50,60,69,77,84,90,95,99層)+後面3次=14次
舉例4:前面都沒碎,在100層碎了,那就更簡單了,因為前面的99層沒碎,直接可得結論,99-100層是臨界點,嘗試總次數只有12次(14,27,39,50,60,69,77,84,90,95,99,100層)
綜上抽檢
無論哪種情況下,都可以做到最壞14次找到臨界點
谷歌經典面試題 雞蛋掉落問題
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...
Google經典燒腦面試題 扔雞蛋問題思路整理
問題 有一棟樓,共100層。定義 雞蛋在第n層樓扔下,不會碎,第n 1層扔下,會碎,那麼第n層就叫臨界樓層 你手中有兩個雞蛋 預設理想狀態 兩個雞蛋完全相同 如何優化嘗試策略,使得使用最少次數,測出臨界樓層 即,使用此策略,最差也可以在多少次以內測出臨界樓層 ps 假定雞蛋一定會在某層樓下落後碎掉 ...
一道有趣的面試題 扔雞蛋問題
下面是一道很經典的智力型面試題,也是我一朋友在bat面試中親身見識過的一道題。各位來體驗一下,看看自己的大腦是不是好使。題目 有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破,在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下,最小化雞蛋下落的次數。假設每...