假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
4. 1 阶 + 1 阶 + 1 阶
5. 1 阶 + 2 阶
6. 2 阶 + 1 阶
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n+2]; //定义一个数组用来存储对应的楼层的方法数
dp[1] = 1; //第一层有1种方法
dp[2] = 2; //第二层有2种方法(每次爬一层,一次爬两层)
for (int i = 3;i<=n;i++) { //从第三层开始到指定的楼层
dp[i] = dp[i-1]+dp[i-2]; //有两种情况:dp[i-1]表示在爬上该层楼梯之前再
//走一步就到指定台阶的方式数(一次走一个台阶),
//dp[i-2]表示在爬上该层楼梯之前还差一步(跨两个台阶)
//到指定台阶的方式数(一次走两个台阶)
}
return dp[n];
}
}
分析:一次可以走一个台阶或者两个台阶,已知只有一个台阶时,上台阶的方式只有一种(一步一个台阶),有两个台阶时,上台阶的方式有两种(一步一个台阶,一步两个台阶)。
当台阶数有三个时,可分为两种情况:
- 一是上到指定台阶之前还差一个台阶(1+1+(1)或者2+(1)),在上来之前,已经上了两层台阶,这两层台阶有多少种方式来上是已知的也就是dp[2],所以这种还差一个台阶就上来的情况的方式就有dp[2] = 2种
- 二是上到指定台阶之前还差一个台阶(2+(1)),在上来之前,已经上了一层台阶,这一层台阶有多少种方式来上是已知的也就是dp[1] ,所以这种还差两个台阶就上来的情况的方式就有dp[1] = 1种
- 上台阶的方式只有这两种,这两个的和就是上当前台阶的方式数为dp[1]+dp[2] = 3种。以此类推,上每一层台阶都有这两种方式,结果总是这两种方式的和,也就是该数组的前两项和。