每日一题 爬楼梯

130 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

70. 爬楼梯 - 力扣(LeetCode) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 阶 + 1 阶
2. 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

二、思路分析:

排列组合法:
n种方法爬楼梯,可以等效为,所有方法中全部由2和1组成,这时候可以设用了i次2个台阶和j次1个台阶,那么就由2i+j=n,其中i,j均为非负整数,只要找到满足这条等式的所有(i,j)就可以了,这时可以设j的取值范围是[0,n],通过(n-j)/2 = i,可以筛选得到满足条件的i。
假设现在找到了一组(i,j)满足2i+j=n了,那么在这组数中,用了i次2个台阶的可能分布是怎样的呢,根据高中学过的公式,
mCn = n!/(m!(n-m)!)
那么从一列n个球中选出 i 组2个连续的球就一共有
iC(n-i) = (n-i)! / (i! (n-i-i)!)
种方法,把这些所有满足(i,j)的方法全都加起来,就得到n阶楼梯所有不同的方法了。

直接法:直接列出题目要求所有阶梯的可能性方法,优点简单粗暴,缺点无技术含量,显然答案跃然纸上

三、AC 代码:

class Solution:
    def climbStairs(self, n: int) -> int:
        ans = 0
        for j in range(0,n+1):
            if (n-j)%2 == 0:
                i = (n-j)/2
                #排列组合公式的结果,全部加起来
                ans += ( self.fact(n-i) / (self.fact(i) * self.fact(n-i-i)) )
        return round(ans)#python乘的数太大会出现小数,这时用round()四舍五入

    def fact(self, num: int) -> int: #阶乘
        if num == 0: 
            return 1 
        else:
            return num*self.fact(num-1)Z