LeetCode 70:爬楼梯

 这道题可以说是动态规划里最最基础的题目了,剑指Offer中的青蛙跳台阶也是这样的题目。

循环的写法:

class Solution {
public:
    int climbStairs(int n) {
        vector<int> f(n); //数组记录爬到每一级台阶的方法数
        if(n==1) return 1;

        f[0] = 1;
        f[1] = 2;
        for(int i=2; i<n; i++) {
            f[i] = f[i-1] + f[i-2];
        } 
        return f[n-1];
    }
};

采用记忆化递归,避免重复计算,可以保证运行不超时(否则会超时):

class Solution {
public:
    int climbStairs(int n) {
        f_ = vector<int> (n, 0);
        return climb(n);
    }

private:
    vector<int> f_;
    int climb(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;
        if(f_[n-1] != 0) return f_[n-1];

        f_[n-1] = climb(n-1) + climb(n-2);
        return f_[n-1];
    }
};

采用"三人行",前两个数推第3个数,不需要申请数组空间,空间复杂度O(1)

class Solution {
public:
    int climbStairs(int n) {
        if(n<=2) return n;

        int one = 1;
        int two = 2;
        int cur;
        for(int i=3; i<=n; i++) {
            cur = one + two;
            one = two;
            two = cur;
        }
        return cur;
    }
};
发布了97 篇原创文章 · 获赞 11 · 访问量 2487

猜你喜欢

转载自blog.csdn.net/chengda321/article/details/102732463