题目
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
解析
1,首先我们考虑最简单的情况。如果只有1级台阶,那么显然就只有一种跳法。如果有2级台阶,那就有两种跳法:一种是分两次跳,每次1级;另外一种就是一次跳2级。
2,接着我们再来讨论一般情况。我们把n级台阶时的不同跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有了两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数据等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。分析到这里,我们不难看出这实际上就是斐波那契数列了。
解1(数组)
//采用DP的办法
public class Solution {
public int climbStairs(int n) {
if(n <= 2)
{
return n;
}
else
{
int[] step = new int[n];
step[0] = 1;
step[1] = 2;
for(int i = 2; i < n; i++)
{
step[i] = step[i-1] + step[i-2];
}
return step[n-1];
}
}
}
解2(迭代)
public class Solution {
public int climbStairs(int n) {
if(n <= 2)
{
return n;
}
else //两级台阶及以上
{
int a0=0,a1=1,a2=0;
for(int i=0;i<n;i++)//计算n次
{
a2=a0+a1;
a0=a1;
a1=a2;
}
return a2;
}
}
}