70.爬楼梯
描述
假设你正在爬楼梯。需要 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 步
我第一反应是用递归实现,然而不出所料超出时间限制。
if n == 1:
return 1
elif n == 2:
return 2
else:
s1 = self.climbStairs(n-1)
s2 = self.climbStairs(n-2)
return s1+s2
所以。。。。再想一想。既然递归不行就递推试试。emmm…网上说这个问题的结果和Fibonacci数列一样。果然是这样。。。尽管可以转换为求解fibonacci,但是还是应该好好思考一下怎么解决原问题。毕竟可能会联想不到fibonacci。
nums = [0,1,2]
if n == 1:
return nums[1]
elif n == 2:
return nums[2]
else:
for i in range(3,n+1):
nums.append(nums[i-1] + nums[i-2])
return nums[n]
上面这个版本通过了,但是只战胜了25%的人,寻求更优的算法吧。
这个很机智啊,我的列表初始化可以优化成如下:
condition = [0] * (n + 1)
condition[0] = 1
condition[1] = 1
for i in range(2, n+1):
condition[i] = condition[i-1] + condition[i-2]
return condition[n]
关于循环和递归:
Loops may achieve a performance gain for your program. Recursion may achieve a performance gain for your programmer. Choose which is more important in your situation!
如果使用循环,程序的性能会更高。如果使用递归,程序更容易理解。