Climbing Stairs
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层的台阶,每一步可以迈1层或者2层台阶,要爬到台阶顶部,有多少种不同的方式?
这是个斐波那契数列问题。我们这样想,最后一步肯定是爬到台阶顶部的,那么这最后一步可以是从n-1层台阶上来的,也可以是从n-2层台阶上来的,因为一步可以迈1层或者2层。所以我们可以有递归公式f(n) = f(n-1) + f(n - 2),初始条件是f(0) = f(1) = 1.
编程这个递归公式可以采用两种方法:递归式和非递归式。
递归式的编码方法直观、简单,缺点很明显,效率低,当n=38时,leetcode就给出了超时的错误
非递归式才能解决这道题目,使用循环实现。
Code
Code 1:递归式的解法(Limit Exceeded)
class Solution {
public :
/*
* 递归式的解法,当n比较大时,会超时,这里在n=38时,leetcode就报超时错误了。
*/
int climbStairs ( int n ) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if ( n == 1 || n == 0 )
return 1 ;
return climbStairs ( n - 2 ) + climbStairs ( n - 1 );
}
};
Code 2:非递归式的解法(Accepted)
class Solution {
public :
int climbStairs ( int n ) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if ( n == 1 || n == 0 )
return 1 ;
int lhs = 1 , rhs = 1 ;
int temp ;
for ( int i = 1 ; i < n ; i ++ )
{
temp = lhs + rhs ;
lhs = rhs ;
rhs = temp ;
}
return rhs ;
}
};