爬楼梯问题(leetcode 70)

384 阅读1分钟

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解题思路:

这个题用“从大到小”的方式思考很好解决:

先假设n = 10,那么最后一步有两种可能,即:从第8个爬2阶和从第9个爬1阶。 所以n = 8的结果加上n = 9的结果就是n = 10的结果。以此类推n=8的结果又是n=7和n=6的结果的和......(斐波那契数列)

递归解决:

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

但递归性能比较差,力扣会超时。可优化为遍历:

var climbStairs = function(n) {
  if (n < 1){
    return 0;
  }
  if(n === 1){
    return 1;
  }
  if (n === 2) {
    return 2;
  }
  var last = 1;
  var prev = 2;
  var ret = 0;
  for (var i = 2; i < n; i++) {
      ret = last + prev;
      last = prev;
      prev = ret;
  }
  return ret;
};