题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?( 只考虑最多 45 层 )
示例 1:
输入:2 输出:2 解释:有两种方法可以爬到楼顶
- 1 步 + 1 步
- 2 步
示例 2:
输入:3 输出:3 解释:有三种方法可以爬到楼顶。
- 1 步 + 1 步 + 1 步
- 1 步 + 2 步
- 2 步 + 1 步
提示:
1 <= n <= 45
题解1:
这是一道比较经典的动态规划问题。
可以使用递归来解决,但是递归的时间复杂度很高,会超时。
因此,我们可以使用动态规划的思想进行优化。
具体来说,我们可以使用一个数组 dp 来保存每一步的结果。其中,dp[i] 表示到达第 i 步的方法数。递推公式为:dp[i] = dp[i-1] + dp[i-2]。因为到达第 i 步只有两种方法,要么从第 i-1 步跨一步到达,要么从第 i-2 步跨两步到达。
代码实现:
var climbStairs = function(n) {
if (n <= 2) {
return n;
}
let dp = new Array(n + 1).fill(0);
dp[1] = 1;
dp[2] = 2;
for (let i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
};
题解2:
到达第 n 级台阶的方法数 = 到达第 n-1 级台阶的方法数 + 到达第 n-2 级台阶的方法数
你得先理解上面这个
走 1 个阶梯,只有 1 个方法(1 次 1 步)
走 2 个阶梯,只有 2 个方法 (2 次 1 步)(1 次 2 步)
走 3 个阶梯,只有 2 个方法 (3 次 1 步)(先 2 步再 1 步)(先 1 步再 2 步)
到达 3 阶的方法数 = 到达 2 阶的方法数 + 到达 1 阶的方法数
到达 n 阶的方法数 = 到达 n-1 阶的方法数 + 到达 n-2 阶的方法数
想到斐波那契数列了吗???
那我们可以把爬楼梯想成这样 [1,2,3,5,8,13,21,34,55] ,数组的最后一位就是答案
代码实现:
var climbStairs = function(n) {
let arr = [1,2,3]
let res;
for(let i=1;i<=n;i++){
if (i===1 || i=== 2 ||i=== 3){
res = i
}else{
arr.push(arr[arr.length-1] + arr[arr.length-2])
res = arr[arr.length-1]
}
}
return res
};