讓我們一起啃演算法----爬樓梯

三斤和他的喵發表於2020-05-12

爬樓梯(Climbing-Stairs)

題幹:

假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
  輸入: 2
  輸出: 2
  解釋: 有兩種方法可以爬到樓頂。
  1. 1 階 + 1 階
  2. 2 階
示例 2:
  輸入: 3
  輸出: 3
  解釋: 有三種方法可以爬到樓頂。
  1. 1 階 + 1 階 + 1 階
  2. 1 階 + 2 階
  3. 2 階 + 1 階
來源:力扣

這題 爬樓梯 算是演算法題裡面比較經典的。

解題思路

這題的解題思路主要有兩種:

1.動態規劃
2.斐波那契數列

動態規劃 算是一個比較重要的解題技巧與思路,後續我會寫一系列需要用動態規劃思路解題的文章,幫助大家更好的理解動態規劃。

這題我們用 斐波那契數列 來解。

斐波那契數列 又稱 兔子數列,指得是:1、1、2、3、5、8、13、21、……,在數學上它得遞推公式是:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

放到這個題目中我們可以發現:
二階樓梯的走法有 2種
1 階 + 1 階 、 2 階
三階樓梯的走法有 3種
1 階 + 1 階、1 階 + 2 階、2 階 + 1 階
四階樓梯的走法有 5種
1 階 + 1 階 + 1 階 + 1 階、1 階 + 2 階 + 1 階、1 階 + 1 階 + 2 階、2 階 + 2 階、2 階 + 1 階 + 1 階
……

綜上,我們可以發現 n 階樓梯有 m 種爬法,且 m 符合 斐波那契數列 規律,所以直接上程式碼咯!

程式碼實現

GO 語言實現

// 斐波那契數列
// 1 1 2 3 5 8 13 ....
func climbStairs2(n int) int {

    // 1 階臺階直接返回 1
    if n == 1 {
        return 1
    }

    // 2 階臺階直接返回 2
    if n == 2 {
        return 2
    }

    current := 2
    pre := 1
    // 當前臺階的走法是前兩個臺階走法之和
    for i := 3; i <= n;i ++ {
        current = current + pre
        pre = current - pre
    }
    return current
}

總結

每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀
github.com/wx-satellite/learning-a...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

三斤

相關文章