面试算法-青蛙跳台阶问题(JAVA实现)
题干
一只青蛙一次可以跳上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级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
看看你能不能找到那个递归公式吧~~
面试算法-青蛙跳台阶问题(JAVA实现)相关推荐
- 《LeetCode力扣练习》剑指 Offer 10- II. 青蛙跳台阶问题 Java
<LeetCode力扣练习>剑指 Offer 10- II. 青蛙跳台阶问题 Java 一.资源 题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总 ...
- 青蛙跳石头java_青蛙跳台阶(JAVA)与递归问题探究
青蛙跳台阶JAVA 一只青蛙一次可以跳上一层台阶,也可以跳上两层,求该青蛙跳上n层的台阶总共有多少种跳法(先后次序不同算不同的结果). 思考:可以看出,每次青蛙出脚都会有两种可能,一步或者两步,再次出 ...
- Java小青蛙跳台街,算法-青蛙跳台阶详解
/* [跳台阶] [题目] 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. [解析] 与斐波那契数列的求解过程类似.典型的动态规划问题.对于第 n 级台阶, ...
- Java小青蛙跳台街,青蛙跳台阶问题:Java版,递归算法和循环
青蛙跳台阶 青蛙跳台阶,青蛙每一次可以跳1阶或2阶,假设有n阶台阶,青蛙要跳完所有台阶,有多少种跳法? 引入斐波那契数列 对于斐波那契数列,百度百科是这么解释的: 斐波那契数列(Fibonacci s ...
- 每日算法——最全青蛙跳台阶算法问题
每日算法 2022年9月12日 一.最全青蛙跳台阶算法问题 问题一:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法. 分析:当n=1的时候,①只需要跳一 ...
- Java:青蛙跳台阶
一只青蛙一次可以跳一级台阶,也可以一次跳2级台阶,那么一只青蛙跳上一个n级台阶总共有几种跳法? 通过画图分别分析一只青蛙跳上一个1级台阶.2级台阶.3级台阶和4级台阶台 ...
- 面试书上一些题目的整理:O(n)复杂度排序年龄 青蛙跳台阶
可以按照年龄的个数,设置99个桶,然后桶内处理. 青蛙跳台阶,每次1阶或者2阶,就是fib数 如果每次1到n阶,那么归纳法可得,是2^(n-1) 另外1*2 覆盖 2*n个矩阵的问题,仍然是Fib数. ...
- php算法台阶,php如何解决青蛙跳台阶的问题(代码)
本篇文章给大家带来的内容是关于php如何解决青蛙跳台阶的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级 ...
- python青蛙跳台阶_Python算法题(一)——青蛙跳台阶
题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: ...
最新文章
- 控制~线性系统~的能控性和能观性
- oracle存clob,oracle数据库里保存clob字段-Oracle
- boost::uuid模块实现宽流存档测试序列化 uuid的测试程序
- jquery网页刷新后控件失效_jquery动态增减控件如何才能不刷新页面
- CentOS7.5 firefox Flash插件更新
- CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式
- list循环添加数据_笔记 | 自学Python 06:数据类型之列表
- 游戏模型提取_腾讯手Q游戏中心的个性化推荐实战
- STM32F401标准固件库配置
- 徐思201771010132《面向对象程序设计(java)》第九周学习总结
- 树莓派如何连接WiFi
- Google Map Web服务API
- python爬虫微信刷票_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
- sentry mysql_Apache Sentry安装及简单使用
- python中的header_python中header是什么意思
- libvirt 详解(1)
- [Pytorch图像分类全流程实战]Task06:可解释性分析
- linux vi 保存退出与不保存退出
- 自学Java最起码要学到什么程度才能出去找工作?
- 【Proteus仿真】【51单片机】数字电压表设计
热门文章
- 关于微信小程序开发中的显示个人信息以及重置密码功能
- FreeCAD软件安装
- Could not load file or assembly ‘office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce11
- 如何远程控制其它电脑!
- WP7应用程序中添加麦克风支持
- CEF中文教程(google chrome浏览器控件) -- CEF简介
- RFID仓库管理系统之售后产品的管理-新导智能
- VR全景电子商务方案/APP/小程序/公众号/网站
- 李航《统计学习方法》读书笔记(1):朴素贝叶斯分类
- 免费小程序制作平台体验感受分享