leetcode Climbing Stairs

来源:互联网 发布:如何关闭windows筛选器 编辑:程序博客网 时间:2024/04/29 16:06

 看到此题,首先想到的是递归求解,但是题意理解错了,题中是说需要n 步到达山顶,每一次可以是一步或者两步,而我理解的是n次中每一次可以是一步或者两步

错误的递归代码如下

class Solution {public:    int climbStairs(int n) {        num = 0;        if(n==0)            return num;        climbStairsHelper(n);        return num;    }        void climbStairsHelper(int n)    {        if(n==0)        {            num++;            return;        }        //choose 1 step        climbStairsHelper(n-1);        //choose 2 step        climbStairsHelper(n-1);    }    private:    int num;};



 正确的递归代码但是超时

class Solution {public:    int climbStairs(int n) {       if(n==0)        return 0;       if(n==1)        return 1;        return climbStairs(n-1)+climbStairs(n-2);    }};


一般情况下递归算法超时后,可以利用动态规划来解决,保留中间结果

动态规划的代码如下 通过

class Solution {public:    int climbStairs(int n) {       vector<int> result(n+1, 0);       if(n==0)        return result[n];              result[0] = 1;       result[1] = 1;               for(int i = 2; i <= n; ++i)         result[i] = result[i-1] + result[i-2];                return result[n];        }};


分析代码注意到,其实每次只用了三个变量

优化后的动态规划代码

class Solution {public:    int climbStairs(int n) {       if(n==0)        return 0;              int a = 1;       int b = 1;       int c = 1;               for(int i = 2; i <= n; ++i)       {         c = a + b;                  a = b;         b = c;       }                return c;        }};



0 0