爬梯子算法 - 斐波那契數列

1. 斐波那契數列 (Fibonacci Sequence)

斐波那契數列,又稱爲黃金分割數列,是數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖引入,所以也稱爲兔子算法,是指這樣的數列:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, …

這個數列從第三項開始, 每一項等於前面兩項之和。

F(1) = 1,
F(2) = 1,
F(n) = F(n - 1) + F(n - 2) (n >= 3)

2. 爬梯子算法

面試中,各大公司經常會考到一個題目就是爬梯子,題目大體描述如下:
假設你正在準備爬樓梯,這個樓梯有n個臺階,每一步可以選擇上一個臺階或者兩個臺階,總共有多少種辦法爬完這個樓梯?
比如:
樓梯臺階數爲2,那麼兩種方法:
1)1臺階 + 1臺階
2) 2臺階

樓梯臺階數爲3,則三種方法:
1)1臺階 + 1臺階 + 1臺階
2)1臺階 + 2臺階
3)2臺階 + 1 臺階

問題分析,假定算法爲climbStair(n):
a) 如果n = 1, climbStair(1) = 1;
b) 如果n = 1, climbStair(2) = 2;
c) 如果n > 3,
第一步爲一個臺階, 那麼方法數就需要看climbStair(n - 1);
第一步爲兩個臺階, 那麼方法數就需要看climbStair(n - 2);
總數應該是climbStair(n - 1) + climbStair(n - 2)

循環操作的話,總會處理到 climbStair(1) + climbStair(2). 所以,爬梯子問題本質就是考察Fibonacci數列。

class Solution {
public:
    int climbStairs(int n) {
        int way2Climb[n + 2];
        way2Climb[1] = 1;
        way2Climb[2] = 2;
        
        for(int i = 3;i <= n;i++){
            way2Climb[i] = way2Climb[i-1] + way2Climb[i-2];
        }
        return way2Climb[n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章