爬楼梯问题

博客围绕爬楼梯问题展开,该问题本质是斐波那契数列求解。介绍了动态规划的简单实现,但其时间复杂度过高;还提及动态规划的复杂性优化方法,即保存计算结果以降低时间复杂度;此外,还提到了非动态规划法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

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

注意:给定 n 是一个正整数。

---------------------------------------------------------------------

本质上是斐波那契数列求解问题。

1.动态规划

f(n)=\begin{cases} 1,n=1\\ 2,n=2\\ f(n-1)+f(n-2),n>3 \end{cases}

简单实现,不过 时间复杂度过高,为O(2^{n})

## 动态规划1
class Solution:
    def f(self,n):
        if n == 1:
            return 1
        elif n==2:
            return 2
        else:
            return self.f(n-1)+self.f(n-2)
    
    def climbStairs(self, n: int) -> int:
        return self.f(n)

 

2.动态规划(复杂性优化)

    将计算结果保存下来,此时时间复杂度为O(n)

## 动态规划2
class Solution:
    def __init__(self):
        self.l = [i*0 for i in range(1000)]
    
    def f(self,n):
        if self.l[n] !=0 :
            res = self.l[n]
        else:
            if n == 1:
                res = 1
            elif n==2:
                res = 2
            else:
                res = self.f(n-1)+self.f(n-2)
            self.l[n] = res
        return res
    
    def climbStairs(self, n: int) -> int:
        return self.f(n)

3. 非动态规划法

# 采用长度为3的数组滚动存储
class Solution:
    def climbStairs(self, n: int) -> int: 
        if n == 1:
            return 1
        elif n==2:
            return 2
        else:
            seq=[1,2,3]
            for i in range(4,n+1):
                seq.append(seq[1]+seq[2])
                del seq[0]
            return seq[-1]
# 将长度为3的数组替换为三个变量
class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            a = 1
            b = 2
            for _ in range(3,n+1):
                c = a + b
                a,b = b,c
            return c
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值