假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
思路
把这个当作是一个排列组合的问题。我们所需考虑的就是我们要走几个两步,这几个两步要怎么走?
以台阶数是9为例。我们分以下情况进行考虑:
1.走0个两步(即全走1步)
此时只有一种走法
2.走1个两步
这就意味着,我们要走1个两步,7个一步。所以我们的走法为
3.走2个两步
这就意味着,我们要走2个两步,5个一步。所以我们的走法为
4.走3个两步
这就意味着,我们要走3个两步,3个一步。所以我们的走法为
5.走4个两步
这就意味着,我们要走4个两步,1个一步。所以我们的走法为
最后把每个情况的结果加起来就行了。
代码如下
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
num_2 = n//2 #计算最多可以走几个两步
res = 0
for i in range(1,num_2+1):
C_n = i #排列组合的上面元素
C_m = n-2*i+i #排列组合的下面元素
fenzi,fenmu = 1,1
for j in range(1,C_n+1):
fenmu = fenmu*j
fenzi = fenzi*C_m
C_m -=1
res += fenzi/fenmu
return res+1 #加上全走1步的情况