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?
先写个简单的递归,只能过小数据。
class Solution {
public:
int climbStairs(int n) {
if(0 == n)
return 1;
else if(1 == n)
return 1;
else if(2 == n)
return 2;
else
return climbStairs(n-1) + climbStairs(n-2);
}
};
一样的代码,再来个备忘录,就牛逼了。
class Solution {
public:
int climbStairs(int n) {
vector<int> memo(n);
for(vector<int>::size_type i = 0; i < memo.size(); ++i)
{
memo[i] = -1;
}
return getNumOfWays(n, memo);
}
int getNumOfWays(int n, vector<int>& memo)
{
if(0 == n)
return 1;
else if(1 == n)
return 1;
else if(2 == n)
return 2;
else
{
if(memo[n - 1] < 0)
memo[n-1] = getNumOfWays(n-1, memo);
if(memo[n - 2] < 0)
memo[n-2] = getNumOfWays(n-2, memo);
return memo[n-1] + memo[n-2];
}
}
};