りっこ:りっこ
あなたが階段を登っているとします。建物の屋上に到達するまでに 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) になります。
アイデアの分析: