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]; } };