题目链接:爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

方法一:动态规划

class Solution {
public:
    int climbStairs(int n) {
        int f[50];
        f[1] = 1;
        f[2] = 2;
        f[3] = 3;
        for (int i = 4;i <= n;i++) {
            f[i] = f[i-2] + f[i-1];
        }
        return f[n];
    }
};

方法二:递归

class Solution {
public:
    int nums[50] = {0};

    int f(int x) {
        if (x <= 2) return nums[x];
        if (nums[x] != 0) return nums[x];   // 关键:已经算过就直接返回

        nums[x] = f(x - 1) + f(x - 2);
        return nums[x];
    }

    int climbStairs(int n) {
        nums[1] = 1;
        nums[2] = 2;
        return f(n);
    }
};

标签: Easy, hot100, 动态规划

添加新评论