题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
---------------------------------------------------------------------
本质上是斐波那契数列求解问题。
1.动态规划
简单实现,不过 时间复杂度过高,为。
## 动态规划1
class Solution:
def f(self,n):
if n == 1:
return 1
elif n==2:
return 2
else:
return self.f(n-1)+self.f(n-2)
def climbStairs(self, n: int) -> int:
return self.f(n)
2.动态规划(复杂性优化)
将计算结果保存下来,此时时间复杂度为。
## 动态规划2
class Solution:
def __init__(self):
self.l = [i*0 for i in range(1000)]
def f(self,n):
if self.l[n] !=0 :
res = self.l[n]
else:
if n == 1:
res = 1
elif n==2:
res = 2
else:
res = self.f(n-1)+self.f(n-2)
self.l[n] = res
return res
def climbStairs(self, n: int) -> int:
return self.f(n)
3. 非动态规划法
# 采用长度为3的数组滚动存储
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n==2:
return 2
else:
seq=[1,2,3]
for i in range(4,n+1):
seq.append(seq[1]+seq[2])
del seq[0]
return seq[-1]
# 将长度为3的数组替换为三个变量
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n == 2:
return 2
else:
a = 1
b = 2
for _ in range(3,n+1):
c = a + b
a,b = b,c
return c