一、题目

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

二、思路解析

1.迭代
第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去。
2.动态规划
我们用 f(x) 表示爬到第 xx 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:
f(x) = f(x - 1) + f(x - 2)
1)可以通过转移方程和边界条件实现一个复杂度是O(n)的。
2)可以用「滚动数组思想」把空间复杂度优化成 O(1)。
滚动数组是DP中的一种编程思想。 简单的理解就是让数组滚动起来,每次都使用固定的几个存储空间,来达到压缩,节省存储空间的作用。 起到优化空间,主要应用在递推或动态规划中。
3.通项公式
通过数学计算得到递推数列的通项公式。直接用这个公式计算就可以。

三、代码

1.迭代java

public int climbStairs(int n) {if(n==1||n==2) return n;int a = 1,b = 2;//a 表示第n-2个台阶的走法,b表示第n-1个台阶的走法,传统迭代int count = 0 ;for(int i = 3;i<=n;i++){count = a+b;//累加结果//向下迭代a = b;//下次迭代的第n-2个台阶的走法等于上次迭代n-1个台阶的走法b = count;//下次迭代的第n-1个台阶的走法等于上次迭代的第n个台阶走法}return count;}

2.动态规划+滚动数组C++

class Solution {public:int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
};

3.动态规划+滚动数组java

class Solution {public int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
}

4.通项公式java

public class Solution {public int climbStairs(int n) {double sqrt5 = Math.sqrt(5);double fibn = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);return (int) Math.round(fibn / sqrt5);}
}

四、总结

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

动态规划/滚动数组/通项公式——爬楼梯相关推荐

  1. 守望者的逃离 动态规划+滚动数组

    题目: 恶魔猎手尤迪安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去 ...

  2. 动态规划——使用最小花费爬楼梯(Leetcode 746)

    题目选自Leetcode 746.使用最小花费爬楼梯 题目描述: 解题代码:C语言 int minCostClimbingStairs(int* cost, int costSize) {int pr ...

  3. LeetCode动态规划 使用最小花费爬楼梯

    数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始). 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶 ...

  4. 【USACO3.1.6】邮票 动态规划/滚动数组

    bool类型:f[i][j]  i这个数额,由j个邮票贴成 是否可行.  f[i][j] = { f[i - p][j - 1] 其中有一个是true即可,p为邮票面额} 换一个思路 f[i]  i这 ...

  5. LeetCode两个爬楼梯题目解析(动态规划)

    原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/m ...

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

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

  7. 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧

    当背包重量是整数时,动态规划可以用数组存储状态就可以了. 当背包重量是非整数时,用map存储状态就可以了!主要思路:  map(构造函数中参数comp是仿函数(或者叫函数对象))+递归优化(" ...

  8. LeetCode刷题(26)~爬楼梯【居然还可以用数学方法!】

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

  9. 动态规划——斐波那契数列(70. 爬楼梯、198. 打家劫舍、213. 打家劫舍II、信件错排、母牛生产)

    递归和动态规划都是将原问题拆分成多个子问题然后求解,但是动态规划存储了子问题的解,不需要重复计算. 动态规划(Dynamic Programming,DP)需要转移方程和边界条件. 目录 一.70. ...

最新文章

  1. mysql选什么隔离级别_互联网项目中mysql应该选什么事务隔离级别
  2. conda安装qiime2-清华镜像源替换法解决安装失败
  3. 华为交换机同一vlan不同网段的通信
  4. 与图论的邂逅05:最近公共祖先LCA
  5. 开源微服务编排框架:Netflix Conductor
  6. 信息安全工程师笔记-网络安全漏洞防护技术原理与应用
  7. 人本原理内涵_叶澜教育学原理课后答案资料配套题库考研真题精选课后习题章节题库...
  8. angularJS中搜索框的用法
  9. 深度学习基础(十)—— 稀疏编码(二)
  10. python机器学习库sklearn——数据预处理
  11. github打开前端样式丢失_微信小程序入门教程之二:页面样式
  12. python做图像处理程序_python图像处理之镜像实现方法
  13. poi合并单元格,没有样式
  14. 桌面图标有蓝底处理刚才
  15. 旁注虚拟主机IIS权限重分配跨目录得webshell
  16. 使用Python在图片上增加文字
  17. 电脑鼠标右键失效linux,鼠标右键失灵,教你win7电脑鼠标右键失灵的应对办法
  18. fail-fast 机制是什么?(详解)
  19. 冯小刚:对“伪民族化”的拨乱反正
  20. 【Elasticsearch 权威指南学习笔记】结构化搜索

热门文章

  1. 基于NodeJS的简易DDNS
  2. 在南开大学参加概率统计会议小记--编辑王丽萍写在南开之行
  3. Protobuf基本用法
  4. 小程序项目实战总结--如何获取手机屏幕宽高?
  5. 淘宝获取购买到的商品订单详情PHP展示
  6. VMware workstation克隆一个虚拟机详细步骤
  7. FullCalendar日历插件使用说明
  8. picview是哪里的图片_PicViewer(图片浏览器)
  9. 10GE网卡终端聚合参数
  10. 如何利用软文营销提高品牌知名度、曝光度?