leetCode打卡——70 climbing stairs

323 阅读1分钟

##题目

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?

Note: Given n will be a positive integer.

// 递归
var climbStairs = function(n) {
    if (n <= 2) {
        return n;
    }
    return climbStairs(n - 1) + climbStairs(n - 2);
};

// 动规
var climbStairs = function(n) {
    if (n <= 2) return n;

    var lastLast = 1;
    var last = 2;
    var now = lastLast + last;

    var time = n - 2;
    while (time--) {
        now = lastLast + last;
        lastLast = last;
        last = now;
    }

    return now;
};

这个问题是个动态规划的题目,可以用以下思维思考: 1.当我在第x级梯子的时候,我有两个选择:一次上1级梯子和一次上2级梯子,反过来思考,当我爬到了第n级梯子的时候,我的上一步有两个选择:一次上1级梯子和一次上2级梯子,也就是F(n) = F(n - 1) + F(n - 2),因此我们可以很简单地用递归的方式求解; 2.我们已经可以将一个问题转化为两个子问题的和,现在我们只需要知道最底部的问题的解,就可以求解该问题,明显n = 1时,结果为1,n = 2时,结果为2;

我们就可以不断地根据前两个的结果求出第三个的结果,可以不使用递归,简单地保存前两次计算的结果即可通过循环的方式得到最终的结果。