题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 :
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
方法分析:
这道题主要是要明白该爬楼梯的规律其实就是符合斐波那契数列(Fibonacci Sequence) 规律的,问题就迎刃而解了。为什么说它是斐波那契数列呢?我们可以这样来思考:当我们从第 n-1 阶楼梯爬到第 n 阶楼梯时,需要1步;当我们从第 n-2 阶楼梯爬到第 n 阶楼梯时,需要2步.也就是说 到达第 n 阶楼梯的方法数等于到达第 n-1 阶楼梯的方法数加上到达第 n-2 阶楼梯的方法数,即 ,其正好符合斐波那契通项。
代码实现:
1. 采用递归实现
var climbStairs = function(n) {
if(n == 1) return 1;
if(n == 2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
};
递归是求解斐波那契数列最经典和最直接的方式,其简洁易懂;但是递归特别费时,在该题中使用会出现超出时间限制的错误提示。
2. 数组方式
var climbStairs = function(n) {
let result = [1,2];
for (let i = 2; i < n; i++) {
result.push(result[i-1] + result[i-2]);
}
return result[n-1];
};
数组方式大大的减少了运行时间,因为从第三项开始 ,所以我们先预设好前两项,再得到结果,返回数组最后一项即可。
3. ES6的方式
var climbStairs = function(n) {
let a = b = 1;
for (let i = 0; i < n; i++) {
[a, b] = [b, a + b];
}
return a;
};
其中 [a, b] = [b, a + b] 表示解构赋值,其等价于
temp = a;
a = b;
b = temp + b;
代码解析:
本文给出了三种解法,其中第一种解法主要是抛出思路,在LeetCode上提交是不会成功的;第二种和第三种方法都利用了数组的知识,方法二较为明了,方法三通过解构赋值给出了另一种思路。
相关链接:https://leetcode-cn.com/problems/climbing-stairs/description/