题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
代码1:
class Solution:
def climbStairs(self, n):
if n < 3:
return n
onestep = 1
twostep = 2
finalstep = 0
for i in range(n-2):
finalstep = onestep + twostep
onestep = twostep
twostep = finalstep
return finalstep
结果1:
代码2:
class Solution:
def climbStairs(self, n):
if n < 3:
return n
climbstairs = [0]*n
climbstairs[0] = 1
climbstairs[1] = 2
for i in range(2, n, 1):
climbstairs[i] = climbstairs[i-1] + climbstairs[i-2]
return climbstairs[n-1]
结果2:
代码3:
class Solution:
def climbStairs(self, n):
if n > 1:
return self.climbStairs(n-1)+self.climbStairs(n-2)
else:
return 1
结果3:
如果使用递归求解,会超时,因为期间进行了大量的重复计算。
说明:
代码1和代码2的原理差不多,都是使用递推求解,该题其实是斐波那契数列的变形,每上一节台阶的总方法数都是,前两阶台阶的方法数的总和,所以递推公式为f(n) = f(n-1) + f(n-2)一直算下去,例如到达第一阶的方法总和为1,到达第二的方法总和为2,所以到达第三阶的时候f(3)=f(2)+f(1)=3,而第四阶时f(4)=f(3)+f(2)=5,......直到到达顶阶n,f(n)中的值即为解。代码1和2的区别在于代码2初始化了一个列表用于模拟台阶数,而代码1只用三个变量保存了最近三阶的值,然后滚动算下去,在内存上更加节省。