leetcode—17.递归题目python解答

这篇博客探讨了使用递归解决LeetCode上的几个经典问题,包括70. 爬楼梯、509. 斐波那契数、面试题08.06. 汉诺塔问题和203. 移除链表元素。博主详细介绍了每个问题的递归思路,以及如何通过优化递归降低时间复杂度,特别是提到重叠子问题的概念和记忆化搜索的应用。
摘要由CSDN通过智能技术生成

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

思路:

不妨假设跳上n级台阶的跳法总数是f(n),我们无法直接得知f(n)和n的关系,也即无法直接给出函数f(n)的表达式。可以使用归纳推理法来推导关系
f(1)=1 [1]
f(2)=2[11,2]
f(3)=3[111,12,21]
f(4)=5 [1111,112,121,211,22]
f(5)=8[11111,1112,1121,1211,2111,122,212,221]
f(6)= 13
归纳出:f(n) = f(n-1) + f(n-2)

思路1:递归

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

在这里插入图片描述
通过递归解题思路很容易得到时间复杂度和空间复杂度都是 O(n)的实现,但是由于这里的 f(x)只和 f(x - 1)与 f(x - 2)有关,所以我们可以用滚动数组思想把空间复杂度优化成 O(1)。
思路2:

class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        
        a = 1
        b = 2
        temp = 0
        for i in range(3,n+</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值