目录
1. 题目
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
2. 思路
这道题有多种解法,其中比较热门的解法分别是递归和动态规划。但无论哪种方法,咱们都要找到它的状态转移式:
f(n) = f(n-1) + f(n-2)
为什么是这个表达式呢?题目中所说每次可以爬1或2个台阶。假设咱们要求第3级台阶的次数,那么咱们有两种跳法:
1. 第1级台阶跳2个台阶
2. 第2级台阶跳1个台阶
3. 动态规划解法
class Solution:
def climbStairs(self, n: int) -> int:
# 定义三个变量来保存状态
f1,f2 = 1,2
f3 = 0
# 如果n为1,则返回1
if n == 1:
return f1
# 如果n为2,则返回2
elif n == 2:
return f2
else:
# 从2开始遍历
for i in range(2,n):
# f(n) = f(n-2) + f(n-1)
f3 = f1 + f2
# 改变f(n-2)和f(n-1)的状态,使得f1 = f2,f2 = f3
f1,f2 = f2,f3
return f3
4. 递归解法
class Solution:
def climbStairs(self, n: int) -> int:
# 如果n为1则返回1,n为2则返回2
if n <= 2:
return n
else:
# 否则返回 f(n-1) + f(n-2)
return self.climbStairs(n-1) + self.climbStairs(n-2)
5. 结果分析
上面两种解法真的适合这道题嘛?题目中变量的范围是:1 <= n <= 45
然而,使用递归这种解法会超时,在n=44的时候会超出时间范围,因此这题咱们使用动态规划的解法比较合适。