爬楼梯(递归、动态规划)

力扣:力扣

假设你正在爬楼梯。需要 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 <= n <= 45

示例代码1:  【递归】

class Solution:
    @functools.lru_cache(100)  # 缓存装饰器
    def climbStairs(self, n: int) -> int:
        if n == 1 or n == 2:
            return n
        return self.climbStairs(n-1) + self.climbStairs(n-2)
        

直接递归解法,容易超时,python可以加个缓存装饰器,这样也算是将递归转换成迭代的形式了。

示例代码2: 【动态规划】【状态缓存】

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = {}
        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)

示例代码3: 【动态规划】【空间压缩】

class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1 or n == 2:
            return n
        a, b, tmp = 1, 2, 0
        for i in range(3, n+1):
            tmp = a + b
            a = b
            b = tmp
        return tmp

只存储前两个元素,减少了空间,空间复杂度O(1)

思路解析:

猜你喜欢

转载自blog.csdn.net/weixin_44799217/article/details/131840497