Climbing Stairs,LeetCode,70

题目描述:

你正在爬楼梯。需要 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 阶

解题思路:

这个问题实际上是一个斐波那契数列问题。假设 f(n) 表示爬到第 n 阶的方法数,那么有以下递推关系:

  • f(1) = 1,只有一种方法,即爬 1 阶。
  • f(2) = 2,有两种方法,即爬两个 1 阶或者一次爬 2 阶。
  • 对于 n > 2,可以从第 n-1 阶爬 1 阶到达第 n 阶,或者从第 n-2 阶爬 2 阶到达第 n 阶。因此,f(n) = f(n-1) + f(n-2)

基于这个递推关系,可以使用动态规划的方法来求解。

动态规划解法:

  1. 定义状态:dp[i] 表示爬到第 i 阶的方法数。
  2. 状态转移方程: dp[i] = dp[i-1] + dp[i-2]
  3. 初始状态: dp[1] = 1dp[2] = 2
  4. 返回结果: dp[n]

代码实现(Python):

class Solution: def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2

    dp = [0] * (n + 1)
    dp[1] = 1
    dp[2] = 2

    for i in range(3, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]

    return dp[n]

优化空间复杂度:

由于每次状态转移只依赖于前两个状态,可以使用两个变量来存储这两个状态,从而将空间复杂度从 O(n) 优化到 O(1)。

优化后的代码(Python):

class Solution: def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2

    a, b = 1, 2
    for i in range(3, n + 1):
        a, b = b, a + b

    return b

总结:

这个问题通过动态规划的方法可以高效解决。关键在于识别出问题的递推关系,并利用动态规划的思想进行状态转移。优化空间复杂度后,代码更加简洁且效率更高。

希望这个详细的解答对你有所帮助!如果有其他问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注