爬楼梯

目录

1. 题目

2. 思路

 f(n) = f(n-1) + f(n-2)

3. 动态规划解法

4. 递归解法

5. 结果分析


1. 题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

2. 思路

        这道题有多种解法,其中比较热门的解法分别是递归和动态规划。但无论哪种方法,咱们都要找到它的状态转移式

 f(n) = f(n-1) + f(n-2)

为什么是这个表达式呢?题目中所说每次可以爬1或2个台阶。假设咱们要求第3级台阶的次数,那么咱们有两种跳法:

1. 第1级台阶跳2个台阶

2. 第2级台阶跳1个台阶

3. 动态规划解法

class Solution:
    def climbStairs(self, n: int) -> int:
        # 定义三个变量来保存状态
        f1,f2 = 1,2
        f3 = 0
        # 如果n为1,则返回1
        if n == 1:
            return f1
        # 如果n为2,则返回2
        elif n == 2:
            return f2
        else:
            # 从2开始遍历
            for i in range(2,n):
                # f(n) = f(n-2) + f(n-1)
                f3 = f1 + f2
                # 改变f(n-2)和f(n-1)的状态,使得f1 = f2,f2 = f3
                f1,f2 = f2,f3
            return f3

4. 递归解法

class Solution:
    def climbStairs(self, n: int) -> int:
        # 如果n为1则返回1,n为2则返回2
        if n <= 2:
            return n
        else:
            # 否则返回 f(n-1) + f(n-2)
            return self.climbStairs(n-1) + self.climbStairs(n-2)

5. 结果分析

        上面两种解法真的适合这道题嘛?题目中变量的范围是:1 <= n <= 45

然而,使用递归这种解法会超时,在n=44的时候会超出时间范围,因此这题咱们使用动态规划的解法比较合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小人物₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值