70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
思路:
不妨假设跳上n级台阶的跳法总数是f(n),我们无法直接得知f(n)和n的关系,也即无法直接给出函数f(n)的表达式。可以使用归纳推理法来推导关系
f(1)=1 [1]
f(2)=2[11,2]
f(3)=3[111,12,21]
f(4)=5 [1111,112,121,211,22]
f(5)=8[11111,1112,1121,1211,2111,122,212,221]
f(6)= 13
归纳出:f(n) = f(n-1) + f(n-2)
思路1:递归
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n == 2:
return 2
else:
return self.climbStairs(n-1) + self.climbStairs(n-2)
通过递归解题思路很容易得到时间复杂度和空间复杂度都是 O(n)的实现,但是由于这里的 f(x)只和 f(x - 1)与 f(x - 2)有关,所以我们可以用滚动数组思想把空间复杂度优化成 O(1)。
思路2:
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n == 2:
return 2
a = 1
b = 2
temp = 0
for i in range(3,n+</