LeetCode算法学习之--数组--爬楼梯

421 阅读1分钟

大家好今天给大家分享下一道 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)
*/

1.png

解法二: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)
 */

2.png

解法三:公式法

代码借鉴 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);
  };

3.png

总结

这道题是考察的是递归的应用,和如何利用hashmap 减少时间复杂度,同时如何利用迭代解决这个dp问题

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com