You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

现在说一下大致思路:求出递推公式

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

[f(n) f(n-1)]=[[1 1][1 0]][f(n-1) f(n-2)]

可以得到递推矩阵

所以该算法的关键点就是:1.需要求出递推矩阵;2.写一个方法,能够实现矩阵相乘

虽然代码量会比其他几个方法大,但是算法复杂度比较低

* 动态规划解法*/
public int climbStairs3(int n) {if (n <= 0)return 0;if (n == 1)return 1;if (n == 2)return 2;int[][] base = { { 1, 1 }, { 1, 0 } };int[][] res = matrixPower(base, n - 2);return 2*res[0][0] + res[1][0];
}
/** 两个矩阵相乘*/
private int[][] muliMatrix(int[][] m1, int[][] m2) {int[][] res = new int[m1.length][m2[0].length];for (int i = 0; i < m1.length; i++) {for (int j = 0; j < m2[0].length; j++) {for (int k = 0; k < m2.length; k++) {res[i][j] += m1[i][k] * m2[k][j];}}}return res;
}

包含三种最常用的回答,第一最优,第三最差

* 空间复杂度O(1);*/
public int climbStairs(int n) {if (n < 3)return n;int one_step_before = 2;int two_steps_before = 1;int all_ways = 0;for (int i = 2; i < n; i++) {all_ways = one_step_before + two_steps_before;two_steps_before = one_step_before;one_step_before = all_ways;}return all_ways;
}
/** 空间复杂度O(n);*/
public int climbStairs_2(int n) {if (n < 3)return n;int[] res = new int[n + 1];res[1] = 1;res[2] = 2;for (int i = 3; i <= n; i++) {res[i] = res[i - 1] + res[i - 2];}return res[n];
}
/** 方法一:递归 时间复杂度高*/
public int climbStairs_1(int n) {if (n < 1)return 0;if (n == 1)return 1;if (n == 2)return 2;return climbStairs_1(n - 1) + climbStairs_1(n - 2);
}

斐波那契数列

class Solution {
public:int climbStairs(int n) {int f = 1;int g = 0;while(n--){f += g;g = f -g;          }return f;}
};

climbing-stairs-动态规划,爬楼梯的路径数相关推荐

  1. 动态规划爬楼梯(为什么到i级的方法=i-1级的方法+到i-2级的方法)

    动态规划爬楼梯(为什么到i级的方法=到i-1级的方法+到i-2级的方法) 先附个原题        初学动态规划,"爬楼梯"是必不可少的,但是相信有好多人都不理解问什么可以直接把变 ...

  2. 爬楼梯与路径类题目记忆化递归与动态规划双解法(Leetcode题解-Python语言)

    70. 爬楼梯(剑指 Offer 10- II. 青蛙跳台阶问题) 递归(英语:Recursion),是指在函数的定义中使用函数自身的方法.有意义的递归通常会把问题分解成规模缩小的同类子问题,当子问题 ...

  3. java 爬楼梯算法_动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...

  4. 动态规划——爬楼梯问题(爬楼梯+最省力爬楼梯)

    1.问题:力扣原题 2.分析 根据题意展开分析,爬第一层楼梯有一种方法,爬到第二层楼梯有两种方法,那么爬到第三层楼梯可以通过从第一层楼梯一次性跨两步到第三层或者从第二层楼梯一次跨一步到第三层.所以到第 ...

  5. 刷题第45, 46天 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数、139.单词拆分

    70. Climbing Stairs 题目链接:70. Climbing Stairs 思路链接:代码随想录动态规划-爬楼梯(进阶) 思路 思路 Code class Solution {publi ...

  6. 再见“小明爬楼梯”问题

    在c语言期末考试中,再次见到了"小明爬楼梯"问题,而第一次见到是在某次面试题中,由于当时还没有学到递归部分,因此就仅仅把代码看了一下,然而其中包含的思想却没有弄清楚,因此在考试时见 ...

  7. leetcode 70. 爬楼梯问题(多种方法总结)

        爬楼梯问题有多种出现形式,有不固定最多可跨阶数(即最多可跨阶数为M,M作为方法参数)的,有固定每次最多可跨2阶的.接下来,我就对以上两种出线形势分别进行分析. (一)固定每次最多跨越2阶,使用 ...

  8. 【力扣动态规划基础专题】:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62. 不同路径 63. 不同路径 II 343. 整数拆分 96. 不同的二叉搜索树

    /** 动态规划专题:这是最简单的并且已经给出了转移方程,平时我们用dp[]数组来表示转移方程转移方程: dp[n] = dp[n-1]+dp[n-2]初始值:dp[0] = 0 , dp[1] = ...

  9. 算法:Climbing Stairs(爬楼梯) 6种解法

    说明 算法:Climbing Stairs(爬楼梯) LeetCode地址:https://leetcode.com/problems/climbing-stairs/ 题目: You are cli ...

  10. [Swift]LeetCode70. 爬楼梯 | Climbing Stairs

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. bind日志配置详解
  2. Percona Cluster集群讲解
  3. Gauss 消元法求解线性方程组
  4. JAVA通信编程(二)——如何读取java的properties配置文件(插播)
  5. 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)
  6. C++入门指南及实战 第一步 概述及经典HelloWorld
  7. 前端学习(586):在元素中动态添加类与伪类
  8. 收藏 | 一文看完吴恩达最新演讲精髓,人工智能部署的三大挑战及解决方案
  9. lazarus的动态方法和虚拟方法
  10. 吴恩达深度学习4.3笔记_Convolutional Neural Networks_目标检测
  11. 汇编语言基础之二 - 各种寻址和过程进出简介
  12. Linux 面试最常问的十个问题
  13. ctfshow - PNG隐写入门赛
  14. 如何压缩word文档的大小?
  15. 利用 SysRq 键排除和诊断系统故障
  16. BLE(15)—— Privacy
  17. 劈荆斩棘:Gitlab 部署 CI 持续集成
  18. 【MATLAB】改变坐标轴范围
  19. Rails+Nginx+Passenger安装配置 简洁可靠
  20. 云服务器物理主机的区别,云服务器与物理机的区别

热门文章

  1. 直连AIX服务器,对接AIX链路问题
  2. Java Web实战篇-代码之美
  3. Python基础--04
  4. Vite理论知识笔记一
  5. Javascript基础知识笔记三
  6. sqlserver替换特殊字符
  7. Css实现页面元素置顶时悬浮
  8. 刚接触新工作的程序员:不会打开终端窗口
  9. 文字处理技术:吾知道他们听不懂,为何讲了一把WP布局
  10. 编程基本功:再紧急的工作到了员工手里,都不急