变态跳台阶-剑指Offer(Java语言)
2019-02-24 10:24
113 查看
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
假设一只青蛙跳上n级台阶共有跳法f(n)
则按最后一跳跳多少级,可以分为
先跳n-1级,最后一跳跳1级,跳法为f(n-1)
先跳n-2级,最后一跳跳2级,跳法为f(n-2)
先跳n-3级,最后一跳跳3级,跳法为f(n-3)
……
先跳1级,最后一跳跳n-1级,跳法为f(1)=1
直接一跳跳上n级,跳法为1,即令f(n-n)=f(0)=1
故有
f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(1)+f(0)
方法一
为避免重复计算,使用map保存计算结果
[code]import java.util.HashMap; public class Solution { HashMap<Integer,Integer> map=new HashMap<>(); public int JumpFloorII(int target) { if(target==0) return 1; else if(target==1) return 1; else if(target==2) return 2; else{ Integer t=map.get(target); if(t==null){ t=0; for(int i=0;i<target;i++){ t+=JumpFloorII(i); } map.put(target,t); } return t; } } }
方法二
由
f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(1)+f(0)
可知
f(n-1)=f(n-2)+f(n-3)+....+f(1)+f(0)
则有
f(n)=f(n-1)+f(n-1)=2*f(n-1)
[code]public class Solution { public int JumpFloorII(int target) { if(target<=0) return 0; else if(target==1) return 1; else if(target==2) return 2; else{ return 2*JumpFloorII(target-1); } } }
或者使用非递归方法
[code]public class Solution { public int JumpFloorII(int target) { if(target<=0) return 0; else if(target==1) return 1; else if(target==2) return 2; else{ int ret=1; while(--target>0) ret*=2; return ret; } } }
相关文章推荐
- JAVA实现变态跳台阶问题(《剑指offer》)
- JAVA实现变态跳台阶问题(《剑指offer》)
- 《剑指offer》牛客网java题解-变态跳台阶
- 剑指offer(java代码)——变态跳台阶
- 【剑指offer——JAVA实现】变态跳台阶
- 二进制中1的个数-剑指Offer(Java语言)
- 《剑指offer》—9、变态跳台阶
- 《剑指offer2》问题10 青蛙跳台阶&&变态跳台阶 Java实现
- 剑指offer第九题【变态跳台阶】c++实现
- 剑指offer 变态跳台阶
- 《剑指offer》牛客网java题解-跳台阶
- 剑指offer-变态跳台阶
- Java变态跳台阶实现思路和代码
- 数值的整数次方-剑指Offer(Java语言)
- 剑指offer——变态跳台阶
- 剑指OFFER----9、变态跳台阶
- 调整数组顺序使奇数位于偶数前面-剑指Offer(Java语言)
- 变态跳台阶java实现
- 剑指Offer(12)变态跳台阶问题(Fibonacci)
- 剑指offer: 变态跳台阶