谷歌經典面試題 雞蛋掉落問題

2021-10-06 14:20:47 字數 1432 閱讀 3676

你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n  共有 n 層樓的建築。

每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。

你知道存在樓層 f ,滿足 0 <= f <= n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。

你的目標是確切地知道 f 的值是多少。

無論 f 的初始值如何,你確定 f 的值的最小移動次數是多少?

示例 1:

輸入:k = 1, n = 2

輸出:2

解釋:雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 f = 0 。

否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 f = 1 。

如果它沒碎,那麼我們肯定知道 f = 2 。

因此,在最壞的情況下我們需要移動 2 次以確定 f 是多少。

通過動態規劃+逆推法解決這個問題,dp[k][m] 的含義是k個雞蛋,移動m次最多能夠確定多少樓層

dp[k][m] 最多能夠確定的樓層數為l,那麼我選定第乙個扔的樓層之後,我要麼碎,要麼不碎

這就是把l分成3段,左邊是碎的那段 長度是dp[k][m - 1],右邊是沒碎的那段 長度是dp[k-1][m - 1] 因為已經碎了乙個了,中間是我選定扔的樓層是1

所以遞推公式是dp[k][m] = dp[k - 1][m - 1] + dp[k][m - 1] + 1

判斷dp[k][m]>n,m為結果

public int supereggdrop(int k, int n) }}

return n;

}

動態規劃

如果雞蛋不碎,那麼狀態變成 (k,n−x),即我們雞蛋的數目不變,但答案只可能在上方的 

n−x 層樓了。

把原問題縮小成了乙個規模為 (k,n−x) 的子問題;如果雞蛋碎了,那麼狀態變成 (k−1,x−1),即我們少了乙個雞蛋,但我們知道答案只可能在第 x 樓下方的 x−1 層樓中了。也就是說,我們把原問題縮小成了乙個規模為 (k−1,x−1) 的子問題。

這樣一來,我們定義 dp(k,n) 為在狀態 (k,n) 下最少需要的步數。根據以上分析我們可以列出狀態轉移方程:

dp(k,n)=1+ min(max(dp(k−1,x−1),dp(k,n−x))),1<=x<=n

public int supereggdrop(int k, int n) 

for (int j = 0; j <= k; j++)

dp[1][0] = 0;

for (int j = 1; j <= k; j++)

for (int i = 0; i <= n; i++)

for (int i = 2; i <= n; i++) }}

return dp[n][k];

}

經典谷歌面試題 扔雞蛋問題

假如有100層樓,總共有2個雞蛋。需要多少次才能試探出臨界點,比如,在第三層扔下去,不碎 在第四層扔下去,碎了,那第三層和第四層就是臨界點。如果之前沒準備過的話,大概第乙個想到的就是二分法。1.二分法 首先在第50層丟第乙個雞蛋,若雞蛋碎了,則在第一層開始往上丟雞蛋,最壞情況是試探49 1次,為什麼...

經典演算法 雞蛋掉落問題

剛好今天身體不太舒服,感冒難受的不行,也沒啥精力去學一些新的東西,就把老東西拾起來稍微拾掇一下,稍微複習一下好了。首先,我們來看一下經典演算法問題的描述 對應的leetcode的題目描述為 這個題目事實上我拿到的第一反應考慮能不能夠直接給出最優求解方案,結果就比較呵呵了,後來也是看了一些解答之後發現...

Google經典燒腦面試題 扔雞蛋問題思路整理

問題 有一棟樓,共100層。定義 雞蛋在第n層樓扔下,不會碎,第n 1層扔下,會碎,那麼第n層就叫臨界樓層 你手中有兩個雞蛋 預設理想狀態 兩個雞蛋完全相同 如何優化嘗試策略,使得使用最少次數,測出臨界樓層 即,使用此策略,最差也可以在多少次以內測出臨界樓層 ps 假定雞蛋一定會在某層樓下落後碎掉 ...