假设有一个梯子,梯子有n层,每次可以爬1层或者2层,求有多少种不同的爬梯方式?

面试的时候遇到的一个问题,本来以为是一道算法题,当时眼前一蒙说的2的n次方,后来想了一下不太对,查了一下,才明白其实考的是数列,所以总结一下。

问题:

假设有一个梯子,梯子有n层,每次可以爬1层或者2层,求有多少种不同的爬梯方式?

思路一:

设 g(n) 为爬 n 阶的方法数,还差最后一步或两步,即将达到第 n 层有两种方法,爬一层或者爬两层,如果爬一阶,其方法数是g(n-1),如果爬二阶,其方法数是g(n-2),即 g(n) = g(n-1) + g(n-2)(n此时必须大于2),以此类推:

g(n) = g(n-1)+g(n-2)

g(n-1) = g(n-2)+g(n-3)

......

g(2) = 2

g(1) = 1

代码:

function climbStairs(n) {
  if (n == 1) return 1;
  else if (n == 2) return 2;
  else {
    return climbStairs(n - 1) + climbStairs(n - 2);
  }
}

思路二:

不用递归,用数组来存放每一阶台阶的爬楼方法数

时间复杂度:

O(n)

空间复杂度:

O(n)

代码:

var climbStairs = function (n) {
    const dp = [];
    dp[0] = 1;
    dp[1] = 2;
    for (let i = 2; i < n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n - 1];
};

 

你可能感兴趣的:(前端面试)