一、题目
假设你正在爬楼梯。需要 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 阶
二、思路
这一题实际上就是一个斐波那契数列。
1. 动态规划
这里呢,用动态规划来走一遍流程
首先列个表:
台阶数 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
方法数 | 1 | 2 | 3 | 5 | 8 | 13 |
通过上边的表格可以发现,从3阶台阶开始,爬上n阶的方法数就等于n-1
阶加上n-2
阶的。
这里呢我们可以定义一个一维数组dp
来保存n阶台阶所对应的m中方法,用i
表示台阶数。然后可以得出状态转移方程:
$$
dp[i] = dp[i-1] + dp[i-2]
$$
接下来就应该考虑特殊情况了,
i == 1
:dp[i] = 1
i == 2
:dp[i] = 2
最后将dp
数组中的最后一个元素返回即可。
接下来优化,在这道题中,我们是没有必要单独创建一个数组的,只需要定义两个变量a
和b
分别来保存i-1
与i-2
位置的值即可。
首先赋初值,a, b = 0, 1
。然后在每次循环时将b
的值重新赋值给a
,i-1
与i-2
位置的值也就是a+b
重新赋值给b
,即a, b = b, a+b
。这样我们便实现了a、b
对应值的自动迭代。
最后将b
的值返回即可。
三、代码
class Solution:
def climbStairs(self, n: int) -> int:
a, b = 0, 1
for i in range(n):
a, b = b, a+b
return b
四、表现
method | 运行时间 | 表现 | 内存消耗 | 表现 |
---|---|---|---|---|
12ms | 95.89% | 12.5MB | 33% |