爬楼梯-leetcode(70)

文章探讨了爬楼梯问题的两种解决方案:一是使用递归方法,但效率较低,时间复杂度为O(2^n);二是采用迭代和记忆化搜索,优化至O(n),通过存储之前步骤的解来避免重复计算。通过迭代方法,可以更高效地计算出到达楼顶的不同路径数量。
摘要由CSDN通过智能技术生成

在这里插入图片描述
题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

思路如下:
1.不推荐 比较容易想的就是递归的方法实现,但是花费的时间比较多,可以看下如下主要思想的代码:

const getNum = function (n) {
  // 爬楼梯的解法,可以想到的是用递归的方法
  // 思路:第n个楼梯的上法是前面n-1,n-2的上法之和
  if (n === 1) return 1;
  if (n === 2) return 2;
  if (n > 2) {
    return getNum(n - 1) + getNum(n - 2);
  }
};

我们可以看到上面的解法:递归的时间复杂度为 O(2^n),因为计算 f(n) 时需要先计算 f(n-1) 和 f(n-2),这样会产生很多重复计算。

2.使用迭代的方法,也就是在上面的方法上变化而来的,可以使用记忆化搜索技术来避免重复计算。迭代的时间复杂度为 O(n),空间复杂度为 O(1)
我们可以使用数组来帮助我们记忆,代码如下:

const getNum = function (n) {
  if (n <= 2) return n;
  //   使用数组来保存前面两种的上楼梯的方法
  let dep = [1, 2];
  //   循环将每层上楼梯的方法保存在数组中,最后返回最后一个元素的值即可
  for (let i = 2; i < n; i++) {
    dep[i] = dep[i - 1] + dep[i - 2];
  }
  return dep[n - 1];
};

console.log(getNum(5));
爬楼梯问题是LeetCode上的经典动态规划问题,编号为第70题,通常被称为“ Climbing Stairs”。该问题描述的是一个人有n级台阶,每次可以爬1阶或2阶,问他有多少种不同的方式能够到达最顶层。这里我们可以通过备忘录法(记忆化搜索)或者自底向上的动态规划方法求解。 **解题思路**: 1. 初始化:对于每层楼,我们都需要知道从第0层到第i层有多少种走法。如果只有一层,显然就只有1种方法;如果有两层,就有1(直接上)+ 1(先上一阶再上)种方法。 2. 动态转移:对于三层及以上的楼层,我们可以计算前两层的所有走法之和,即第i层的走法数等于从第(i-2)层走两步。 **伪代码**: ``` function climbStairs(n): dp = [0] * (n + 1) dp[0], dp[1] = 1, 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] ``` **流程图**: 1. 初始化一个长度为n+1的数组dp,其中dp[i]表示到达第i层的方法数。 2. 设置初始状态:dp[0] = 1,dp[1] = 1。 3. 对于i从2到n,遍历数组,dp[i] = dp[i-1] + dp[i-2]。 4. 循环结束后,返回dp[n]作为结果。 **代码(Python)**: ```python def climbStairs(n): if n == 0 or n == 1: return n dp = [0] * (n + 1) dp[0], dp[1] = 1, 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] # 测试 print(climbStairs(3)) # 输出 3,因为可以从第一层上1阶到第三层,也可以从第二层上两阶到第三层 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值