假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
第一反应使用递归,递归就是调用函数本身,优点就是代码简洁,但带来的就是时间和空间消耗较大。每一次的函数调动都会在内存栈中分配空间保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1:
return 1
elif n == 2:
return 2
else:
a = self.climbStairs(n-1)
b = self.climbStairs(n-2)
return a + b
提交的答案超出时间限制,就要考虑使用递推的方法解决这个问题。不同于递归是自己调用自己,递推并不是这样;而且递推不是将问题从复杂变为简单,而是从简单一步步先前发展,得到最终答案,是一个正向的过程;而且递推并不需要知道这里的n;最后,在可以计算的情况下递推的效率是高于递归的。
下面这个代码用到了斐波那契数列的思想:想不到啊= =
class Solution:
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
num = [0, 1, 2]
if n == 1:
return num[1]
if n == 2:
return num[2]
else:
for i in range(3, n+1):
num.append(num[i-1]+num[i-2])
return num[n]