问题描述:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
问题分析:
这是一道十分经典的动态规划题目,我们可以用递归或者动态规划来实现求解。
首先,假设n阶楼梯有 f(n)种方法爬到楼顶,由题意可知,我们每次可以爬1或2个台阶,因此我们可以得到如下递推式:
f(n) = f(n - 1) + f(n - 2)
我们还可以由题意知道以下初始条件:
f(1) = 1 ,f(2) = 2
现在我们就可以使用递归或者动态规划的思想来解决这个问题。由于递归的效率偏低,而且还可能出现栈溢出的问题,因此我们这里使用动态规划来实现代码。
java代码实现:
public int climbStairs(int n) {
//楼梯阶数为1或2则直接返回结果
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
//用数组f来存放不同阶数楼梯的走法
int[] f = new int[n];
f[0] = 1; //f[0]表示阶数为1时有1种走法
f[1] = 2; //f[1]表示阶数为2是有2种走法
for(int i = 2; i < f.length; i++){
f[i] = f[i-1] + f[i-2]; //核心步骤,由低阶楼梯的走法数递推得到高阶楼梯的走法数
}
return f[n-1]; //注意返回的是f[n-1],因为数组的下标从0开始,f[n-1]就对应n阶楼梯的走法数
}