假设你正在爬楼梯。需要 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阶的楼梯再走2阶楼梯,和先走2阶楼梯再走1阶楼梯,这两种走法是不同的方法.但是在动态规划没有这类问题的区分.实际上,对于爬楼梯的方法数进行计算和列表后,发现其实就是Fibonacci 序列,剩下的就是比较简单的实现了
此题目看出分析题目和理解很重要!!!!!!
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
a = [1, 2]
for i in range(0, 100):
temp = a[i+1] + a[i]
a.append(temp)
return a[n-1]
二刷准备用递归和动态规划来做的,再次遇到这道题目还是没有想起斐波那契数列,不过想起某公司面试的惨痛教训。
这次依旧沿着之前的想法进行计算,但是需要引入一个cache,没有这个代码不能被AC,查了一下采用hashmap的字典(这里不能用列表,尝试过会报错,因为列表未初始化长度是没有cache[n]的),有这样的表示方法可以加速计算过程。
cache = {}
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n in cache:
return cache[n]
if n == 1:
return 1
if n == 2:
return 2
else:
res = self.climbStairs(n-1) + self.climbStairs(n-2)
cache[n] = res
return res