LeetCode高频100题刷题记录之——爬楼梯

本文记录了一道LeetCode高频题目——爬楼梯的不同方式,通过排列组合法、动态规划法、矩阵快速幂法和通项公式法进行解析。重点探讨了动态规划的解决方案,包括基础公式和新增条件下的变化,揭示了动态规划在解决此类问题上的高效性。

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

1 问题描述

假设有nnn阶楼梯,每次可以爬1或2阶,求有多少种爬楼梯的方式,使得我们可以登顶。

在动态规划那一节中有给出在上面条件下加一个“不能连续两次爬2阶”时的解法。

2 排列组合法

自己实现的时候用的方法比较low,将这个问题分解成求nnn可以分成多少个1与多少个2的组合,假设2的数目有mmm个,那么1的数目有n−2mn-2mn2m个,一共需要走n−mn-mnm步,这里面的走法就有Cn−mmC_{n-m}^{m}Cnmm种,遍历所有可能的mmm的数目,得到最终解:

class Solution:
    def climbStairs(self, n: int) -> int:

        if n == 1:
            return 1
        else:
            numtwo = n // 2  # 统计n中可以由多少个2组成
            numway = 1
            predot = 1
            for i in range(1, numtwo + 1):  # 采取的方案中,n的数目从0到numtwo
                predot = predot * i
                numway += (self.stepdot(n, i) / predot)

            return int(numway)

    def stepdot(self, n, m):
        a = n - 2 * m + 1
        b = n - m
        if a == b:
            return a
        else:
            sd = 1
            for j in range(a, b + 1):
                sd = sd * j
            return sd


时间复杂度为O(n2)O(n^2)O(n2),比较低效的一种解法。

3 动态规划法

感觉做这种题目还是应该去学习动态规划的思想,而不是老是选择可以暴力求解的方法,多看一些解法自己也能够收获成长。

假设一共还是有nnn阶楼梯,我们把走法数量记为f(n)f(n)f(n),从n−1n-1n1阶或n−2n-2n2都可以一步登上第nnn阶,因此:
f(n)=f(n−1)+f(n−2) f(n)=f(n-1)+f(n-2) f(n)=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值