Title

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

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

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

示例 1:

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

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

Solve

递归

递归的思路就比较简单了,但是一般第一个能想到的方法都会超时。

    def climbStairs_recursion(self, n: int) -> int:def solve(num):if num == 0:return 1if num < 0:return 0return solve(num - 1) + solve(num - 2)return solve(n)


动态规划

用f(x)表示爬到第x级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,可以列出如下式子:f(x)=f(x−1)+f(x−2)f(x)=f(x-1)+f(x-2)f(x)=f(x−1)+f(x−2)这就是动态规划的转移方程,它意味着爬到第x级台阶的方案数是爬到第x-1级和爬到第x-2级台阶方案数的总和。

下面我们来讨论边界条件,从第0级开始:f(0)=1,从第0级到第1级只有一种解决方案,即爬1级,所以f(1)=1,以这两个作为边界条件就可以继续往后推导出第n级的解决方案。

我们不妨写几项来验证一下,根据转移方程得到 f(2) = 2,f(3) = 3,f(4) = 5…我们把这些情况都枚举出来,发现计算的结果是正确的。

通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n) 的实现,但是由于这里的 f(x) 只和 f(x - 1) 与 f(x - 2) 有关,所以我们可以用「滚动数组思想」把空间复杂度优化成 O(1)。

    def climbStairs_dynamic_programming(self, n: int) -> int:f0, f1, ans = 0, 0, 1for i in range(1, n + 1):f0 = f1f1 = ansans = f0 + f1return ans

复杂度分析

时间复杂度:循环执行 n 次,每次花费常数的时间代价,故渐进时间复杂度为 O(n)。
空间复杂度:这里只用了常数个变量作为辅助空间,故渐进空间复杂度为 O(1)。

矩阵快速幂

动态规划方法的时间复杂度为O(n),只适用于n比较小的情况,在n变大之后,O(n)的时间复杂度会让这个算法看起来有些捉襟见肘,我们可以用「矩阵快速幂」的方法来优化这个过程。

首先我们可以构建这样一个递推关系:[1110][f(n)f(n−1)]=[f(n)+f(n−1)f(n)]=[f(n+1)f(n)]\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} f(n) \\ f(n-1) \end{bmatrix} =\begin{bmatrix} f(n)+ f(n-1) \\ f(n) \end{bmatrix} =\begin{bmatrix} f(n+1) \\ f(n) \end{bmatrix}[11​10​][f(n)f(n−1)​]=[f(n)+f(n−1)f(n)​]=[f(n+1)f(n)​]

因此:[f(n+1)f(n)]=[1110][f(n)f(n−1)]=[1110]2[f(n−1)f(n−2)]=...=[1110]n[f(1)f(0)]\begin{bmatrix} f(n+1) \\ f(n) \end{bmatrix}= {\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}} \begin{bmatrix} f(n) \\ f(n-1) \end{bmatrix}={\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}}^2 \begin{bmatrix} f(n-1) \\ f(n-2) \end{bmatrix}=...={\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}}^n \begin{bmatrix} f(1) \\ f(0) \end{bmatrix}[f(n+1)f(n)​]=[11​10​][f(n)f(n−1)​]=[11​10​]2[f(n−1)f(n−2)​]=...=[11​10​]n[f(1)f(0)​]

令:M=[1110]M= \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} M=[11​10​]因此,我们只要快速计算矩阵M的n次幂,就可以得到f(n)得值。

    def climbStairs_matrix_fast_power(self, n: int) -> int:def multiply(matrixA, matrixB):ans = []for i in range(2):ans.append([])for j in range(2):ans[i].append(matrixA[i][0] * matrixB[0][j] + matrixA[i][1] * matrixB[1][j])return ansdef solve(matrix, num):ret = [[1, 0], [0, 1]]while num > 0:if (num & 1) == 1:ret = multiply(ret, matrix)num >>= 1matrix = multiply(matrix, matrix)return retM = [[1, 1], [1, 0]]res = solve(M, n)return res[0][0]

复杂度分析

时间复杂度:同快速幂,O(log n)。
空间复杂度:O(1)。

LeetCode Algorithm 70. 爬楼梯相关推荐

  1. 【LeetCode】70.爬楼梯

    题目 假设你正在爬楼梯,需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢? 题解 方法1:基本递归 算法 基本递归即初学递归时所学的最简单.最直观的方 ...

  2. leetcode系列-70. 爬楼梯

    题目描述:假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. ...

  3. leetcode算法70.爬楼梯

  4. LeetCode 70爬楼梯71简化路径72编辑距离(dp)

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...

  5. leetcode - 70. 爬楼梯

    70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...

  6. Python描述 LeetCode 70. 爬楼梯

    Python描述 LeetCode 70. 爬楼梯   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端开发.pyt ...

  7. 变形版汉诺塔:LeetCode:70爬楼梯

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

  8. LeetCode 70. 爬楼梯 (递归斐波那契 | 动态规划)

    70. 爬楼梯 解法1 (暴力递归) 推出递推式子:f(n) = f(n - 1) + f(n - 2) 是一个斐波那契数列,用递归 class Solution {public int climbS ...

  9. LeetCode - 70. 爬楼梯(人肉递归、动态规划)2

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

最新文章

  1. C++基本语法的知识体系
  2. SAP S4HANA 介绍LTMC的文章链接
  3. 北京公交线路查询(离线)
  4. Spring表单的initBinder:绑定表单复杂属性
  5. Linux sed替换内容中有空格解决办法
  6. 2010.11.13信息系统项目管理师考试下午试题答题思路剖析
  7. RestartOnCrash一个监控进程的小工具,可用于监控iis/apache/mysql等程序
  8. 能源感知型云计算的快速摘要
  9. 用postman做接口测试
  10. 部署前端项目 Linux系统的nginx配置
  11. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias ' star.facade.vipuser.vo.
  12. springboot发送qq邮件详细步骤
  13. 计算机网络求校验码,计算机网络课程设计校验码的计算
  14. 关于Matlab在雷达数据处理中的一些经验分享
  15. [POJ3683]Priest John's Busiest Day
  16. 如何破解计算机管理员的密码
  17. H3C防火墙端口开启二层模式,网络不通的解决方法
  18. 【UE4】4.26安卓打包流程
  19. 基于51单片机智能IC卡电表控制系统
  20. 【蓝桥杯预备营集结十二】软件类 C/C++ 强化预备试题分析及解答

热门文章

  1. activeMq-2 高可用以及集群搭建
  2. Scala中的类和对象
  3. 站立会议-2014-04-14
  4. VS 2013 Preview 自定义 SharePoint 2013 列表 之 两个Bug
  5. MOSS 2010:Visual Studio 2010开发体验(15)——LINQ to SharePoint
  6. php post aborted,php文件无法得到POST过来的数据
  7. python写网络调试助手_Qt开源作品4-网络调试助手
  8. python中的idle在哪里_python idle 的打开方式
  9. 【数据结构】—顺序表的插入、删除、查找操作
  10. centos7下安装storm步骤