您的位置:首页 > Web前端

变态跳台阶-剑指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;
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: