Leetcode|70. 爬楼梯【笔记】

链接

https://leetcode-cn.com/problems/climbing-stairs/

前言

表示不会做,先标记一下,这题应该很多知识要补
自己想的有点眉目,但是不知道如何实现出来

题目

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

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1+ 12.  2

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1+ 1+ 12.  1+ 23.  2+ 1

关键

关键在于斐波那契数列,也就是得发现f(n) = f(n-1) + f(n-2)
但是没想到得出这种关系就能解题
第n层楼梯的方法由n-1层的方法和n-2层的方法组成

  • 因为n-1层方法再上1个台阶就是n层,n-2层方法再上2个台阶就也是n层;所以把二者加在一起就是n层的总方法

思路1

# 直接递归解法,容易超时,python可以加个缓存装饰器,这样也算是将递归转换成迭代的形式了
# 除了这种方式,还有增加步长来递归,变相的减少了重复计算
# 还有一种方法,在递归的同时,用数组记忆之前得到的结果,也是减少重复计算
class Solution:
    @functools.lru_cache(100)  # 缓存装饰器
    def climbStairs(self, n: int) -> int:
        if n == 1: return 1
        if n == 2: return 2
        return self.climbStairs(n-1) + self.climbStairs(n-2)
  • 缓存装饰器
    functools.lru_cache(maxsize=128, typed=False)
    • maxsize代表缓存的内存占用值,超过这个值之后,就的结果就会被释放,然后将新的计算结果进行缓存,其值应当设为2的幂
    • typed若为True,则会把不同的参数类型得到的结果分开保存
  • 递归:程序调用自身

思路2

  • 初始状态:dp[1]=1,dp[2]=2
  • 状态转化公式:dp[i] = dp[i-1] + dp[i-2]
  • 用字典的话会比列表快
# 直接DP,新建一个字典或者数组来存储以前的变量,空间复杂度O(n)
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]
  • {}表示字典

思路3

# 还是DP,只不过是只存储前两个元素,减少了空间,空间复杂度O(1)
class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1 or n==2: return n
        a, b, temp = 1, 2, 0
        for i in range(3,n+1):
            temp = a + b
            a = b
            b = temp
        return temp

思路4?

# 直接斐波那契数列的计算公式喽
class Solution:
    def climbStairs(self, n: int) -> int:
        import math
        sqrt5=5**0.5
        fibin=math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1)
        return int(fibin/sqrt5)

相似题:剑指 Offer 10- II. 青蛙跳台阶问题

  • 比leetcode70多了一个初始0的状态:
class Solution:
    def numWays(self, n: int) -> int:
        dp = {}
        dp[0] = 1
        dp[1] = 1
        dp[2] = 2
        for i in range(3, n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]%1000000007

扩展:牛客:加到n/上楼梯

  • 3种情况:+1,+2,+3
class GoUpstairs:
    def countWays(self, n):
        dp = [0] * (n+1)
        dp[1] = 1
        dp[2] = 2
        dp[3] = 4
        for i in range(4, n+1):
            dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % 1000000007
        return dp[n]

相关知识

疑问

拓展

  • 完全背包问题

相似题型

在这里插入图片描述

参考

[1] 70.重拳出击(Python3)🙃汇集了题解区五大主流方法,要学姿势就要学的全面点
[2] Python中最常见括号()、[]、{}的区别
[3] Python入门 数据结构 dict字典
[4] 「代码随想录」70. 爬楼梯【动态规划经典题目】详解
[5] functools.lru_cache装饰器详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值