假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
1 | 输入: 2 |
示例 2:
1 | 输入: 3 |
典型的解法是动态规划。
这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。
第 i 阶可以由以下两种方法得到:
在第 (i-1) 阶后向上爬 1 阶。
在第 (i-2) 阶后向上爬 2 阶。
所以到达第 i 阶的方法总数就是到第 (i-1) 阶和第 (i-2) 阶的方法数之和。
令 dp[i]表示能到达第 i阶的方法总数:dp[i]=dp[i-1]+dp[i-2]
本文主要为了说明这个公式,为什么到达第 i 阶的方法总数就是到第 (i-1) 阶和第 (i-2) 阶的方法数之和?到达第 (i-1) 阶的方法和达到第 (i-2) 阶的方法里难道没有重复的?
其实只看到达第 (i-1) 阶的方法
和达到第 (i-2) 阶的方法
,确实可能有重复的。但是达到第 i 阶的方法
中第 (i-1) 阶的方法+1
与 第 (i-2) 阶方法+2
,这两者绝无可能重复,且没有遗漏,所以是典型的动态规划问题,大问题可以分解成同样的小问题加以解决。
示例:
1 | public class Solution { |
复杂度分析
- 时间复杂度:O(n),单循环到 n 。
- 空间复杂度:O(n),dp 数组用了 n 的空间。