python [LeetCode] 爬楼梯

假设你正在爬楼梯。需要 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 阶

思路
把这个当作是一个排列组合的问题。我们所需考虑的就是我们要走几个两步,这几个两步要怎么走?
以台阶数是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步的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值