题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
不看题解的话我真的不会发现这就是斐波那契数列啊!!!
-
确定dp数组的下标和含义
根据 第 i 层楼梯, 推出有 dp[i] 种方法爬到楼顶 -
确定dp公式
试想一下,要想爬到第i层,一定要经过上一层或者上两层,要么是从i-1层爬一层上来,要么是从i-2层爬两层上来,会不会有从i-3层爬3层上来的情况?那样就重复了,因为爬到i-1层可以由爬到i-2层和i-3层的方法数来推出,所以动态规划的思想很明显,下一时刻可以由之前的状态推出。若要爬到第 i-1 层楼梯,相应的应该有 dp[i - 1] 种方法,每种方法的基础上,最后再爬一层,就爬到了第 i 层;
若要爬到第 i-2 层楼梯,相应的应该有 dp[i - 2] 种方法,每种方法基础上,再多爬两层,就到了第 i 层;
所以推出dp公式:dp[i] = dp[i - 1] + dp[i - 2] -
dp数组初始化
初始化dp[1] = 1; dp[2] = 2; -
确定遍历顺序
从前向后遍历 -
举例推到dp数组的几个值
i | dp[i] |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
代码
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 2];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}