题干

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

数据范围:0<= n <=40
要求:时间复杂度:O(n) ,空间复杂度O(1)。

解题思路

首先,这是一道经典的DP(动态规划)问题,动态规划是通过组合子问题的解而解决整个问题的。动态规划通常应用于最优化问题。其解法类似于我们在数学中学过的归纳法:

1. 描述最优解的结构
2. 递归定义最优解的值
3. 按自底向上的方式计算最优解的值
- 摘自《算法导论》

OK,理论讲完了,我们来分析一下这个青蛙跳台阶的问题,青蛙要跳上n级的台阶有两种情况,情况1是青蛙先跳到了(n-2)级台阶,然后又跳了2级;情况2是青蛙先跳到了(n-1)级台阶,然后又跳了1级。那么这个问题就拆解为了青蛙跳到n-2级台阶有几种跳法和青蛙跳到n-1级台阶有几种跳法两个子问题,即f(n)=f(n-1) + f(n-2),以此递归,直到f(2)和f(1),这两个的解我们是已知的。

显然,我们可以用递归的方式来写很快实现此功能,见示例代码1,但是递归的解法显然不满足题干里时间复杂度O(n)的要求,显然很多值我们需要重复计算,比如计算f(5)的解,我们需要先计算f(4)和f(3)的解,计算f(4)的时候又需要计算f(3)和f(2)的解,那么f(3)就被计算了两次。当然,聪明的你肯定能想出使用一个数组或map来保存第一次得到的结果,下次需要的时候直接就取出来用的方法,可以避免重复计算,见示例代码2,可这又违背了题干中空间复杂度O(1)的要求。

那怎么办呢?上面说了,我们可以使用自底向上的计算方式,即循环遍历,先计算出f(3),然后计算f(4),以此类推,不需要额外的存储空间。这一解法让我不禁想起金庸小说里的一招轻功“武当梯云纵”,就是不断的左脚踩右脚,哈哈~~

示例代码

  • 常规递归解法
public class Solution {public int jumpFloor(int target) {if(target == 1) return 1;if(target == 2) return 2;return jumpFloor(target -1) + jumpFloor(target -2);}
}
  • 保存中间结果
public class Solution {Map<Integer,Integer> tmpMap = new HashMap<>();public int jumpFloor(int target) {if(tmpMap.containsKey(target)) return tmpMap.get(target);if(target == 1) return 1;if(target == 2) return 2;int result = jumpFloor(target -1) + jumpFloor(target -2);tmpMap.put(target,result);return result;}
}
  • 最终解法
public class Solution {public int jumpFloor(int target) {int a=1,b=1,c=0;for(int i=2;i<=target;i++){c = a + b;a = b;b = c;} return c;}
}

延伸拓展

相关问题变种,总之就是魔鬼青蛙各种跳:

  1. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
  2. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

看看你能不能找到那个递归公式吧~~

面试算法-青蛙跳台阶问题(JAVA实现)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 10- II. 青蛙跳台阶问题 Java

    <LeetCode力扣练习>剑指 Offer 10- II. 青蛙跳台阶问题 Java 一.资源 题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总 ...

  2. 青蛙跳石头java_青蛙跳台阶(JAVA)与递归问题探究

    青蛙跳台阶JAVA 一只青蛙一次可以跳上一层台阶,也可以跳上两层,求该青蛙跳上n层的台阶总共有多少种跳法(先后次序不同算不同的结果). 思考:可以看出,每次青蛙出脚都会有两种可能,一步或者两步,再次出 ...

  3. Java小青蛙跳台街,算法-青蛙跳台阶详解

    /* [跳台阶] [题目] 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. [解析] 与斐波那契数列的求解过程类似.典型的动态规划问题.对于第 n 级台阶, ...

  4. Java小青蛙跳台街,青蛙跳台阶问题:Java版,递归算法和循环

    青蛙跳台阶 青蛙跳台阶,青蛙每一次可以跳1阶或2阶,假设有n阶台阶,青蛙要跳完所有台阶,有多少种跳法? 引入斐波那契数列 对于斐波那契数列,百度百科是这么解释的: 斐波那契数列(Fibonacci s ...

  5. 每日算法——最全青蛙跳台阶算法问题

    每日算法 2022年9月12日 一.最全青蛙跳台阶算法问题 问题一:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法. 分析:当n=1的时候,①只需要跳一 ...

  6. Java:青蛙跳台阶

            一只青蛙一次可以跳一级台阶,也可以一次跳2级台阶,那么一只青蛙跳上一个n级台阶总共有几种跳法?         通过画图分别分析一只青蛙跳上一个1级台阶.2级台阶.3级台阶和4级台阶台 ...

  7. 面试书上一些题目的整理:O(n)复杂度排序年龄 青蛙跳台阶

    可以按照年龄的个数,设置99个桶,然后桶内处理. 青蛙跳台阶,每次1阶或者2阶,就是fib数 如果每次1到n阶,那么归纳法可得,是2^(n-1) 另外1*2 覆盖 2*n个矩阵的问题,仍然是Fib数. ...

  8. php算法台阶,php如何解决青蛙跳台阶的问题(代码)

    本篇文章给大家带来的内容是关于php如何解决青蛙跳台阶的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级 ...

  9. python青蛙跳台阶_Python算法题(一)——青蛙跳台阶

    题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: ...

最新文章

  1. 控制~线性系统~的能控性和能观性
  2. oracle存clob,oracle数据库里保存clob字段-Oracle
  3. boost::uuid模块实现宽流存档测试序列化 uuid的测试程序
  4. jquery网页刷新后控件失效_jquery动态增减控件如何才能不刷新页面
  5. CentOS7.5 firefox Flash插件更新
  6. CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式
  7. list循环添加数据_笔记 | 自学Python 06:数据类型之列表
  8. 游戏模型提取_腾讯手Q游戏中心的个性化推荐实战
  9. STM32F401标准固件库配置
  10. 徐思201771010132《面向对象程序设计(java)》第九周学习总结
  11. 树莓派如何连接WiFi
  12. Google Map Web服务API
  13. python爬虫微信刷票_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
  14. sentry mysql_Apache Sentry安装及简单使用
  15. python中的header_python中header是什么意思
  16. libvirt 详解(1)
  17. [Pytorch图像分类全流程实战]Task06:可解释性分析
  18. linux vi 保存退出与不保存退出
  19. 自学Java最起码要学到什么程度才能出去找工作?
  20. 【Proteus仿真】【51单片机】数字电压表设计

热门文章

  1. 关于微信小程序开发中的显示个人信息以及重置密码功能
  2. FreeCAD软件安装
  3. Could not load file or assembly ‘office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce11
  4. 如何远程控制其它电脑!
  5. WP7应用程序中添加麦克风支持
  6. CEF中文教程(google chrome浏览器控件) -- CEF简介
  7. RFID仓库管理系统之售后产品的管理-新导智能
  8. VR全景电子商务方案/APP/小程序/公众号/网站
  9. 李航《统计学习方法》读书笔记(1):朴素贝叶斯分类
  10. 免费小程序制作平台体验感受分享