LeetCode算法面試題彙總之開始之前(5): 雞蛋掉落

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

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

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

每次移動,你可以取一個雞蛋(如果你有完整的雞蛋)並把它從任一樓層 X 扔下(滿足 1 <= X <= N)。

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

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

 

示例 1:

輸入:K = 1, N = 2
輸出:2
解釋:
雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 F = 0 。
否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 F = 1 。
如果它沒碎,那麼我們肯定知道 F = 2 。
因此,在最壞的情況下我們需要移動 2 次以確定 F 是多少。

示例 2:

輸入:K = 2, N = 6
輸出:3

示例 3:

輸入:K = 3, N = 14
輸出:4

 

提示:

  1. 1 <= K <= 100
  2. 1 <= N <= 10000

解題思路:

這個題挺坑的,開始我還以爲是二分查找,但是想想還是不對。後來看到了一篇博客,這裏是博客鏈接。

       大致意思就是如果你有TestCount個測試機會(扔雞蛋的機會 或者移動的次數),eggsCount個雞蛋,這時我們任意選擇在第x層扔雞蛋,如果雞蛋沒碎,這時你還剩餘TestCount - 1次機會,eggsCount個雞蛋,我們可以確定x下面getConfirmFloors(TestCount - 1, eggsCount) 層。
如果雞蛋碎了,這時你還剩餘TestCount - 1次機會,eggsCount - 1個雞蛋,我們可以確定getConfirmFloors(TestCount - 1, eggsCount - 1)層,並且x層也被確定了。

class Solution {
    public int superEggDrop(int K, int N) {
        int test = 1;
        while(frequency(test, K)<N){
            test++;
        }
        return test;
    }
    public int frequency(int test, int k){
        if(test == 1 || k == 1){
            return test;
        }
        return frequency(test-1, k - 1) + 1 + frequency(test-1, k);
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章