力扣----11. 爬楼梯(JavaScript实现)
题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
JavaScript实现:
如果观察数学规律,可知本题是斐波那契数列,那么用斐波那契数列的公式即可解决问题,公式如下:
时间复杂度:
空间复杂度:O(1)
/** * @param {number} n * @return {number} */ var climbStairs = function(n) { const sqrt5 = Math.sqrt(5); const fib_n = Math.pow((1+sqrt5)/2,n+1) - Math.pow((1-sqrt5)/2,n+1) return Math.round(fib_n/sqrt5) };
动态规划
时间复杂度:O(n)
空间复杂度:O(n)
var climbStairs = function(n) { const res = []; res[0] = 1; res[1] = 1; for(let i=2;i<=n;i++) { res[i] = res[i-1] +res[i-2] } return res[n]; };
正常思路
时间复杂度:O(n)
空间复杂度:O(1)
var climbStairs = function(n) { if(n ===1 || n===0){ return 1; }else{ var pre = 1; var cur = 1; for(var i = 2; i <= n; i++){ cur = pre + cur; pre = cur - pre; } return cur } }
递归
时间复杂度:O(2^n)
不推荐
var climbStairs = function(n) { let res = 0; if(n === 1 || n===0) return 1; if(n>1){ res = climbStairs(n-1) + climbStairs(n-2) } return res; };