70. 爬楼梯


一、题目

假设你正在爬楼梯。需要 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 == 1dp[i] = 1
  • i == 2dp[i] = 2

最后将dp数组中的最后一个元素返回即可。

接下来优化,在这道题中,我们是没有必要单独创建一个数组的,只需要定义两个变量ab分别来保存i-1i-2位置的值即可。

首先赋初值,a, b = 0, 1。然后在每次循环时将b的值重新赋值给ai-1i-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%

文章作者: Arvin He
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arvin He !
评论
  目录