筆試題——變態跳臺階

題目:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思考:在臺階數少的時候,可以手動計算一下跳臺階的跳法。

臺階數 = 1時,

1 總共1種

臺階數 = 2時,

1 + 1, 2 總共2種

臺階數 = 3時,

1 + 1 + 1, 1 + 2,  2 + 1, 3 總共4種

臺階數 = 4時,

1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1,  2 + 1 + 1, 2 + 2, 3 + 1, 1 + 3, 4 總共8種

另臺階數爲1時的跳法爲f(1), 臺階數爲2時的跳法爲f(2), 臺階數爲3時的跳法爲f(3),以此類推,臺階數爲n時的跳法爲f(n)。

f(1) = 1; f(2) = 2; f(3) = 4; f(4) = 8...

可以找到以下規律,

f(1) = 1

f(2) = f(1) + 1 = 1 + 1 = 2

f(3) = f(2) + f(1) + 1 = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + 1 = 4 + 2 + 1 + 1 =8

可以另f(0) = 1, 能夠發現以下規律

f(1) = f(0)

f(2) = f(1) + f(0) = 1 + 1 = 2

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + f(0) = 4 + 2 + 1 + 1 =8

以此類推,可以得出

f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)

編程書寫情況和運行結果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        vector<int> f(number + 1);
        f[0] = 1;
        f[1] = 1;
        for(int i = 2; i <= number; i++) {
            f[i] = 0;
            for(int j = 0; j < i; j++) {
                f[i] += f[j];
            }
        }
        return f[number];
    }
};

以上代碼測試結果,運行時間:2ms 佔用內存:480K

當然,此題還有更優解法

例如,把f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)繼續優化

f(n - 1) = f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)

f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

當n = 1,f(1) = 1;

當n > 1, f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

編程書寫情況和運行結果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 1) {
            return 1;
        }
        else {
            return 2 * jumpFloorII(number - 1);
        }
    }
};

以上代碼測試結果,運行時間:4ms 佔用內存:476K

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