階段を登る (再帰的、動的プログラミング)

りっこ:りっこ

あなたが階段を登っているとします。建物の屋上に到達するまでに n 歩かかります。

一度に1段か2段ずつ登ることができます。建物の屋上に行くには、何通りの方法がありますか?

例 1:

入力: n = 2
出力: 2
説明: 建物の屋上に登るには 2 つの方法があります。
1. 1次+1次
2. 2次

例 2:

入力: n = 3
出力: 3
説明: 建物の頂上に登るには 3 つの方法があります。
1. ティア 1 + ティア 1 + ティア 1
2. ティア 1 + ティア 2
3. ティア 2 + ティア 1

ヒント:

1 <= n <= 45

サンプルコード 1:  [再帰]

class Solution:
    @functools.lru_cache(100)  # 缓存装饰器
    def climbStairs(self, n: int) -> int:
        if n == 1 or n == 2:
            return n
        return self.climbStairs(n-1) + self.climbStairs(n-2)
        

直接再帰的な解決策はタイムアウトになりやすいため、Python ではキャッシュ デコレーターを追加できますが、これは再帰を反復形式に変換するとみなすことができます。

サンプルコード2:【動的プログラミング】【ステートキャッシュ】

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = {}
        dp[1] = 1
        dp[2] = 2
        for i in range(3, n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

以前の変数を格納するための新しい辞書または配列を作成します。空間計算量 O(n)

サンプルコード 3: [動的プログラミング] [空間圧縮]

class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1 or n == 2:
            return n
        a, b, tmp = 1, 2, 0
        for i in range(3, n+1):
            tmp = a + b
            a = b
            b = tmp
        return tmp

最初の 2 つの要素のみが格納されるため、スペースが削減され、スペースの複雑さは O(1) になります。

アイデアの分析:

おすすめ

転載: blog.csdn.net/weixin_44799217/article/details/131840497