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?
这道题目类似于Fibonacci 数列。
解法有两种,一种是递归,一种是非递归:
非递归:
class Solution {
public:
int climbStairs(int n) {
if(n<=2)
return n;
int n1 = 1;
int n2 = 2;
int temp =3;
int t;
while(temp<=n)
{
t = n1 + n2;
n1 = n2;
n2 = t;
temp++;
}
return n2;
}
};
递归:
递归效率较低,我的一个递归算法没有被LeetCode 系统接受,理由是当n很大的时候,递归太多。
改进的方法是: 将每一个运算的结果记录下来,这样下一次计算的时候,如果已经算出值的,就不用再算一遍了
改进算法:
class Solution {
unordered_map<int, int> res = {{1,1},{2,2},{3,3}}; //必须放在climbStairs 外面,全局变量
public:
int climbStairs(int n) {
if(res.find(n) == res.end())
{
res[n] = climbStairs(n-1) + climbStairs(n-2);
}
return res[n];
}
};