问题描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
算法思想:
本题若用普通的递归,则会超时,所以应该用动态规划,即递推思想,我们首先知道,走1层楼梯有1种方法,走两层楼梯有两种方法,走n层楼梯的方法总数应该是先走1层楼梯,剩下再走n-1层楼梯的方法总数加上先走2层楼梯,剩下再走n-2层楼梯的方法总数之和。
代码实现
public int climbStairs(int n) {
int[] ways=new int[n+2]; //ways[i]表示当只有i层阶梯时的方法总数
int result=1;
ways[1]=1; //爬1层楼梯的方法总数
ways[2]=2; //爬2层楼梯的方法总数
for(int i=3;i<=n;i++){
//当阶梯为第i层时,第i层的爬楼梯方法总数等于
//先爬1层,然后爬剩下的i-1层的方法总数加上先爬两层,然后爬剩下的i-2层方法总数
ways[i]=ways[i-1]+ways[i-2];
}
return ways[n];
}