70. Climbing Stairs
Question: Climbing Stairs
Solution1
爬到第 n 階的方法 = 爬到 n - 1 階的方法 + 爬到 n - 2 階的方法
因為單純寫遞迴會超時
class Solution:
def climbStairs(self, n: int) -> int:
def s(n):
if n == 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 2
return s(n - 1) + s(n - 2)
return s(n)
代表重複計算的部分要抽出來,另外存,因此用一個 hash map 改寫如下後,就可以囉!
from collections import defaultdict
class Solution:
def climbStairs(self, n: int) -> int:
s_method = defaultdict(int)
def s(n):
if n == 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 2
s1 = s_method[n - 1] if n - 1 in s_method else s(n - 1)
s2 = s_method[n - 2] if n - 2 in s_method else s(n - 2)
method = s1 + s2
s_method[n] = method
return method
return s(n)
Solution2
- 爬到第 1 階的方式有 1 種:0 → 1 = 1
- 爬到第 2 階的方式有 2 種:0 → 1 → 1, 0 → 2 = 2
- 爬到第 3 階的方式有 3 種: 爬到第 1 階後一次走兩格, 爬到第二階後一次走一格 = 第一階方法 + 第二階方法 = 1 + 2 = 3
- 爬到第 4 階的方式有 5 種:爬到第 2 階後一次走兩格,爬到第 3 階後一次走一格 = 第二階方法 + 第三階方法 = 2 + 3 = 5
- 依此類推
- 用 list 紀錄每一階到達的方法,依序算出要到達的階層
class Solution:
def climbStairs(self, n: int) -> int:
stairs_method = [1, 2]
for i in range(2, n):
stairs_method.append(stairs_method[i - 1] + stairs_method[i - 2])
return stairs_method[n - 1]
改良上個方式,只需要存取最近的兩個方法就好,讓空間複雜度降低class Solution:def climbStairs(self, n: int) -> int:one, two = 1, 1for i in range(n - 1):method = one + twoone, two = two, methodreturn two
Comments
Post a Comment