刷題系列 - 計算爬樓梯不同步數的方法數

張國平發表於2020-02-24

這個題目是這樣的,如果一次可以向上移動1格或者2格,給出一定格數的梯子,有多少種移動方法可以剛好到頂。

比如給出2格梯子,有兩種方法,一個是 1->1;還有是 一次 走2 格;

給出3格梯子,有三種方法,一個是1->1->1; 還有1->2, 還有2->1。


這個題目看起來好像很複製的樣子,分析下,其實本質就是一個斐波拉契陣列,一個n格的梯子方法數,可以是n-1 和n-2 的方法數之和。


程式碼也就很簡單了,遞迴既可以,這裡使用一個課程中提到的針對遞迴提速的快取字典技巧;因為在遞迴分解時候,往往很多分解計算要跑很多次,把第一次的結果放在一個字典裡面快取使用可以大大提高速度。在實際使用中,可以使用functools.lru_cache這樣工具,用裝飾器形式更快捷的實現。實際提交程式碼後,顯示執行速度也是超過85%的結果。

class Solution:
    cacheTable = {}
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            if n in self.cacheTable.keys():
                return self.cacheTable[n]
            else:
                stepCount = self.climbStairs(n-1) + self.climbStairs(n-2)
                self.cacheTable[n] = stepCount
                return stepCount


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2676927/,如需轉載,請註明出處,否則將追究法律責任。

相關文章