- 题目描述
假设你正在爬楼梯。需要 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 阶
- 解决思路一
自己想到的方法就是递归,f(1) = 1;f(2) =2;f(n) = f(n-1)+f(n-2)
实质上就是n个台阶的走法 = 走一级台阶之后,n-1个台阶的走法+走两级台阶之后,n-2个台阶的走法
但是超时了。。。。不知道咋办,又去求助网络
- 代码一
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n ==1:
return 1
elif n==2:
return 2
else:
return self.climbStairs(n-1)+self.climbStairs(n-2)
- 解决思路二
该问题的结果好斐波那契数列是一样的,所以,,本质上还是那个思路。不同的是用一个列表来存放着第i个元素对应的解法数量。问题解决了最起码,这就是所谓的动态规划。
- 代码二
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
fab = [0,1,2]
for i in range(3,n+1):
m = fab[i-1] + fab[i-2]
fab.append(m)
return fab[n]
- 总结
(1)递归会占用过多的内存空间和运行时间
网友总结:
(2)所有递归的方法都可以转化成非递归的方法,也就是动态规划
(3)动态规划:通过把大问题分解为相对简单的子问题的方式求解复杂问题的方法。适用于有重叠子问题和最优子结构性质的问题
(4)思想:将大问题分解成小问题,然后合并小问题的解,进而得到大问题的解。实际上就是解决了小问题之后,把小问题的解存储成一个表,当要使用的时候就查表,直接调用之前的到的结果。
(5)动态规划和分治法的思想很类似,都是把化大为小,逐个击破。区别在于分治法分成的小问题都是相互独立的,需采用递归的做法,而动态规划分成的小问题之间有一定的联系,可以通过查找来直接使用。