切換
舊版
前往
大廳
主題

LeetCode - 70. Climbing Stairs 解題心得

Not In My Back Yard | 2020-08-09 00:00:12 | 巴幣 2 | 人氣 401

題目連結:


題目意譯:
你正在爬樓梯。需要爬 n 階才會到頂。

每次你可以爬 1 階或 2 階。你會有多少相異的走法可以爬到頂?

限制:
1 ≦ n ≦ 45



範例測資:
範例 1:
輸入: 2
輸出: 2
解釋: 有兩個方法爬到頂。
1. 爬 1 階 + 爬 1 階
2. 爬 2 階

範例 2:
輸入: 3
輸出: 3
解釋: 有三個方法爬到頂。
1. 爬 1 階 + 爬 1 階 + 爬 1 階
2. 爬 1 階 + 爬 2 階
3. 爬 2 階 + 爬 1 階


解題思維:
可以看到 n = 1 、 2 、 3 、 4 、 5 、 …… 時,方法數為 1 、 2 、 3 、 5 、 8 、 ……,而此即為費氏數列。

因為當要求 n = k 的方法數時,可以來到第 k 階的,可能是從第 k - 1 階走一階上來或是從第 k - 2 階走兩階上來。也就是方法數 = k - 1 的方法數 + k - 2 的方法數。此即為費氏數列的遞迴關係式。除了階梯走法是以 1 、 2 開頭,費氏則是以 1 、 1 開頭。兩者差了一個「1」,但其後完全一致。

因此,我們可以用三個變數 F 、 S 以及一個暫存用的變數 buffer(F 、 S 初始化為 1 、 1)。接著做 n 次以下的步驟:
將 F + S 之值存進 buffer 裡,然後將 F 之值更新成 S 之值,最後將 S 之值更新為 buffer 之值。
上述做完 n 次之後即可得到所求的走 n 階階梯之方法數。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作