超级跳台阶的动态规划实现
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
实现方式有很多,可以根据推论用位运算、递归、或者直接用pow方法
我这里只要是考虑用动态规划的思路去解决,空间效率不是最好,只是说最近在了解动态规划,所以一题多解嘛
public class Solution {public int JumpFloorII(int target) {if(target==0){return 0;}if(target==1){return 1;}if(target==2){return 2;}//数组下标对应的值代表到达该下标位置的跳法数int[] arrays = new int[target+1];arrays[0]=1; //直接跳到target,永远为1,且计算第i层(除去1,2)都会加要加上这个arrays[1]=1;arrays[2]=2;for(int i=3;i<=target;i++){//下边的循环的意思是第i位置前边的第j(j>=1)个位置对应跳数相加//到j=0时,表示一次性跳到i位置。for(int j=0;j<=i-1;j++){arrays[i] = arrays[j]+arrays[i];}}return arrays[target];/*else{return (int)(Math.pow(2,target-1));}*/}
}
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
…
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)
说明:
1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。
2)n = 1时,只有1种跳法,f(1) = 1
n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)
n = 3时,会有三种跳得方式,1阶、2阶、3阶,
那么就是
第一次跳出1阶后面剩下:f(3-1);
第一次跳出2阶,剩下f(3-2);
第一次3阶,那么剩下f(3-3)因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
n = n时,会有n中跳的方式,1阶、2阶…n阶,得出结论:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
到这里我们已经可以使用动态规划的方法了,根据n阶数所对应的跳法,可建立线索记忆化的数组
例如当 target = 3 时 该数组有长度为4,index=0的值为0,index=1的值为1,index=2的值为2。由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f((n-1)-(n-1)) +f((n-1)-(n-2))+ … + f(n-2)+ f((n-1)-1)
f(n) = f(n-n) + f(n-(n-1))+…+f(n-2)+f(n-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1)
可以得出:
f(n) = 2*f(n-1) -> f(n)=2^(n-1)。这是一个推出来的公式,然后直接调用pow方法也可以得到结果
if(target==0){return 0;}
return (int)(Math.pow(2,target-1));
超级跳台阶的动态规划实现相关推荐
- 台阶问题---动态规划算法
问题描述 所谓的台阶问题就是说,从0开始上台阶1,2,3...n,每次只能上1个或者2个台阶.问上到n个台阶有多少种走法.这个问题是比较典型的,也有很多种变形,我们先讲解下这种的实现. 问题分析 我们 ...
- [剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]
[问题描述][中等] 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法.答案需要取模 1e9+7(1000000007),如计算初始结果为:100000 ...
- 剑指offer面试题10- II. 青蛙跳台阶问题(动态规划)(递归)(斐波那契数列)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...
- 台阶问题——动态规划
台阶问题 题目描述 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少11级),问到达第N级台阶有多少种不同方式. 输入格式 两个正整数N,K. 输出格式 一个正整数,为不同方式数,由于答 ...
- 动态规划的框架(套路), 总结
动态规划题目千变万化,很多人刚入门时候都觉得非常难以理解,题目越做越挫,越做打击越大,看着别人的题解,心里只能默念一句卧槽,这都能写出状态方程! 走了那么多弯路,才发现问题所在,主要原因是因为基础的东 ...
- Leetcode-跳台阶问题
一次跳一阶或者跳两阶 使用递归求解 使用动态规划,可当做斐波那契数列 第一次跳1阶,则有F(n−1)F(n-1)F(n−1)次跳法: 第一次跳2阶,则有F(n−2)F(n-2)F(n−2)次跳法: 因 ...
- LeetCode刷题剑指 Offer 10- II. 青蛙跳台阶问题
LeetCode刷题剑指 Offer 10- II. 青蛙跳台阶问题 动态规划的思想,青蛙每次可以跳一个或两个台阶,要想得到最终青蛙跳n阶台阶的方法数,需要找到青蛙跳n-1个台阶的方法数和跳n-2个台 ...
- 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中
Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...
- 算法工程师笔试 -剑指offer-习题详细解答
说明 主要编程语言为 C/C++ 涉及字符串的问题可能会使用 Python 题目编号以原书为准,如"面试题 3:数组中重复的数字" 因为题目不多,所以就不做分类了 所有代码均通过 ...
- 深信服面试常见算法题整理笔记
⭐️我叫恒心,一名喜欢书写博客的研究生在读生. 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧. 文章目录 1 反转链表 ...
最新文章
- Windows 技巧篇-鼠标指针安装方法,漂亮的鼠标指针推荐
- 【好书试读】大数据处理之道
- 【题解】luogu p1111 修复公路
- (原創) 今天拿到學生證了 (日記)
- Django-内置用户系统
- oracle asm 分布式存储,分布式数据中心数据库和存储部署解决方案
- CentOS 7 修改IP地址
- 新书 | Kevin P. Murphy《概率机器学习:进阶》PDF开放下载
- RN调试利器——React Native Debugger
- ubuntu 移动硬盘复制小文件可以,复制大文件总是复制不成功
- 端口错误 给Arduino下载程序提示
- 计算机如何设置桌面文件筐,360安全桌面怎么设置文件筐 自定义分框其实非常简单...
- 【Linux】安装系统的时候遇到grub-install Error 问题的解决,超详细傻瓜式教程
- C措辞教程第四章: 数组(8)
- python循环语句打印输出1-10_python_不用循环打印1-1000
- 按文件名批量分类文件到文件夹
- tp-link无线路由与android手机无线连接设置指南,苹果手机(iPhone)无线连接TP-LINK路由器解决方案...
- 用FreeMarker生成Word文档
- VC欣赏、家人是阻力,极客化、国际化——90后创业生态
- matlab曲线加颜色,matlab学习之绘制参数曲线,添加辅助线以及颜色设置