原题目:
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?
看到这道题的时候,我第一眼就想到递归,当前需要跨的阶梯数是n级,我当前是跨第一步呢,还是跨两步,那n级爬阶梯的求法就是这两种方法的总和。下面我给出递归的方法。
class Solution {
public:
int climbStairs(int n) {
if(n==0)
return 0;
if(n==1)
return 1;
return climbStairs(n-1)+climbStairs(n-2);
}
};
这种递归的解法代码非常简洁,非常易懂,但是,后面的求解过程有很多是重复的,因此造成的效率是极地了。所以说,我们要采用非递归的方式进行。
思路:假如说,我现在需要爬三级阶梯,第一种方法是跨一步,那还剩下两步(剩下两步很显然,有两种方法),那现在这种方法与两步的方法数是一样的,所以说为2;第二种方法是跨两步,那还剩下一步,显而易见,只有一种方法。
把上面两种方法相加,就是爬三级阶梯的方法数。
同样的方法,我们知道四级阶梯的方法数是二级阶梯方法数与三级阶梯数的之和。
如果我们,先求出三级阶梯的方法数,再记录一下,再求四级阶梯的方法数,记录一下,一次往下求。。。,一直求到n级阶梯为止。这样就不需要重复求解。
还有一个节省内存空间的技巧,每次我只需要前面两级n-1和n-2的阶梯数,所以说我们每次只要记录前两次,用pre1和pre2记录,每次循环更新一下
下面上代码:
class Solution {
public:
int climbStairs(int n) {
if(n==0)
return 0;
if(n==1)
return 1;
int pre1=1;
int pre2=2;
int cur=pre2;
for(int i=3;i<=n;i++)
{
cur=pre1+pre2;
pre1=pre2;
pre2=cur;
}
return cur;
}
};