演算法學習記錄八(C++)--->一句程式碼搞定變態跳臺階

Deft_MKJing宓珂璟發表於2017-08-11

基本跳臺階問題

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

解法一(遞迴)

對於本題,前提只有 一次 1階或者2階的跳法。

  • a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n-1個臺階,跳法是f(n-1);
  • b.假定第一次跳的是2階,那麼剩下的是n-2個臺階,跳法是f(n-2)
  • c.由a\b假設可以得出總跳法為: f(n) = f(n-1) + f(n-2)
  • d.然後通過實際的情況可以得出:只有一階的時候 f(1) = 1 ,只有兩階的時候可以有 f(2) = 2
  • e.可以發現最終得出的是一個斐波那契數列:
class Solution {
public:
    int jumpFloor(int number) {
        if(number <= 0){
            return -1;
        }
        else if(number == 1){
            return 1;
        }
        else if(number == 2){
            return 2;
        }
        else{
            return jumpFloor(number-1) + jumpFloor(number-2);
        }
    }
};

看下執行時間
這裡寫圖片描述

解法二(迭代)

f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以總結出f(n) = f(n-1) + f(n-2)的規律,但是為什麼會出現這樣的規律呢?假設現在6個臺階,我們可以從第5跳一步到6,這樣的話有多少種方案跳到5就有多少種方案跳到6,另外我們也可以從4跳兩步跳到6,跳到4有多少種方案的話,就有多少種方案跳到6,其他的不能從3跳到6什麼的啦,所以最後就是f(6) = f(5) + f(4);

class Solution {
public:
    int jumpFloor(int number) {
        if(number <= 0){
            return 0;
        }

        if(number == 1){
            return 1;
        }

        if(number == 2){
            return 2;
        }
        int first = 1;
        int second = 2;
        int third = 0;
        for(int i = 3;i<=number;i++){
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }
};

這裡寫圖片描述

很顯然,遞迴更加耗時而且更加佔用記憶體

變態跳臺階問題描述

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

分析

只是一個數學問題罷了,你隨便推一下就能推出
f(n) = 2*f(n-1)
2^(n-1)

程式碼

class Solution {
public:
    int jumpFloorII(int number) {
        return 1<<--number;
    }
};

一句話搞定!!!

相關文章