大家好今天给大家分享下一道 LeetCode 简单难度 的题目[爬楼梯](leetcode-cn.com/problems/li…)
这里主要是分享思路和注释,供大家更好的理解题目解法,代码部分是参考LeetCode 转写成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 阶
分析
1.首先我们的目标是上到第n层阶梯,那么我们有2种选择
1.从 n-1 层 爬1个阶梯
2.从 n-2 层 爬2个阶梯
2.如果爬到 n-1层是不是我们也有2个选择
3.如果爬到 n-2层是不是我们也有2个选择
.
.
.
4.依次类推这道题可以看作是类似fabonacci的问题。
5.求解 f(n)= f(n-1)+f(n-2)
解法有3种
1.递归法 + map
2.DP
3.公式法
解法一:递归 + map
代码借鉴 leetcode-cn.com/problems/re…
思路
1.因为f(n)=f(n-1)+f(n-2),在求解过程中会计算非常多的重复值
2.所以使用map来缓存计算过的值
3.终止条件 n<=3 return n;
*/
var climbStairs = function (n) {
// 设定map来缓存值
const map = new Map();
function climbStairsCount(n) {
if (n <= 3) return n;
// 如果存在就直接返回缓存的值
if (map.has(n)) return map.get(n);
const result = climbStairsCount(n - 1) + climbStairsCount(n - 2);
// 缓存计算后的值
map.set(n, result);
return result;
}
return climbStairsCount(n);
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
解法二:DP
思维
1.因为在迭代的过程中我们只需要记住上一步的 f(n-2) 和f(n-1)
2.所以我们可以使用2个指针来处理类似的问题
*/
var climbStairs = function (n) {
// 处理特殊的条件 当n<=2 return n
if (n <= 2) return n;
let p = 1,
q = 2,
k = null;// k作为结果值
for (let i = 2; i < n; i++) {
// 求得k
k = p + q;
// 移动指针
p = q;
q = k;
}
return k;
};
/* 复杂度
时间 O(n)
空间 O(1)
*/
解法三:公式法
代码借鉴 leetcode-cn.com/problems/cl…
思路
1.采用公式
2.为什么是n+1 不是n? 因为fibonacci 数列是以0 开始的, 而这个题是以1开始的
*/
var climbStairs = function(n) {
const sqrt5 = Math.sqrt(5);
const res = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);
return Math.round(res / sqrt5);
};
总结
这道题是考察的是递归的应用,和如何利用hashmap 减少时间复杂度,同时如何利用迭代解决这个dp问题
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com