题目描述:
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例
比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法
返回 3
思路:
这是一道非常具有代表性的动态规划的一道问题。
令f[n]记录到达第n阶台阶的方法数。假设你还有最后一步就能到达第n阶台阶,那么最后一步,你可以选择两种方式:1)踏一步以及,2)踏两步。如果是踏一步,那么你要从第n-1阶台阶踏出,此时的方法数是 f[n-1];如果是踏两步,那么你要从第n-2阶台阶出发,此时的方法数是f[n-2]。所以爬到第n级台阶的方法总数有f[n] = f[n-1] + f[n-2]种。状态转移方程:
f[n] = f[n-1] + f[n-2]
所以可以敲出一下代码
int climbStairs(int n) {
// write your code here
if (n <= 1)
return 1;
else
return climbStairs(n-1) + climbStairs(n-2);
}
但是我们会发现这样子当n太大时会出现栈溢出
public int climbStairs(int n) {
// write your code here
int[] a=new int[n+1];
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
其实到这里还可以继续优化,使用两个变量代替一维数组
public int climbStairs(int n) {
// write your code here
if(n==0||n==1)
return 1;
int temp1,temp2;
temp1=temp2=1;
int res=0;
int i=2;
while(i<=n){
res=temp1+temp2;
temp1=temp2;
temp2=res;
i++;
}
return res;
}