题干

一只青蛙一次可以跳上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. linux 隐藏权限,Linux权限位,s权限,t权限,及隐藏权限
  2. 【模板】第二类斯特林数Stirling
  3. SSO单点登录之跨域问题
  4. 免费分享老男孩全栈9期视频,共126天
  5. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...
  6. HealthKit教程 Swift版:锻炼信息
  7. java程序编辑器_java实现编辑器(一)
  8. Gitlab备份、升级、恢复
  9. 信息论基础 原书第二版 中文版
  10. 读取头部姿态数据集300W_LP、AFLW2000、BIWI数据集中的真值
  11. php网站后台密码忘记,phpweb忘记后台密码
  12. a星地图测试工具_A星算法地图编辑器
  13. easyui filebox文件大小校验
  14. 自定义数据集(Pokemon)实战
  15. Qt项目的新首席维护人员
  16. 如何判断linux是32位还是64位?
  17. 通过Docker创建CentOS容器
  18. E. Vowels(SOSdp的简单转化)
  19. gtsam 学习十(ISAM2 理论)
  20. 开发中遇到的bug-Property or method “xxxx“ is not defined on the instance but referenced during render.

热门文章

  1. Cassandra之jdbc-cassandra使用笔记
  2. 基于android的母婴商城app系统
  3. LDAP简述与相关攻击手法
  4. 文思海辉智翼云与ZStack IaaS软件完成产品兼容互认证
  5. ARM7中断处理过程、状态、嵌套
  6. 项目6 创建与使用存储过程
  7. AI 正在引领一场新型科学革命
  8. XSS Challenges stage#1-10闯关详解
  9. linux双屏鼠标移,ubuntu如何实现双屏显示
  10. java聊天室数据库_课内资源