持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
一、题目描述:
70. 爬楼梯 - 力扣(LeetCode)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 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