/*
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
*/
import java.util.*;
public class JumpFloor {
//法一:暴力搜索
public int jumpFloor(int target) {
//求出满足条件的1级台阶与2级台阶个数的所有搭配
List<Integer> iList = new ArrayList<Integer>();
List<Integer> jList = new ArrayList<Integer>();
for(int i = 0;i <= target;i ++) {
for(int j = 0;j <= target / 2;j ++) {
if(i + j * 2 == target) {
iList.add(i);
jList.add(j);
}
}
}
//针对每一组搭配进行组合,例如:得出某一搭配为3个1级台阶与2个2级台阶,对3和2进行组合可得共C 5 2种
int count = 0;
int sum = 0;
for(int i = 0;i < iList.size();i ++) {
sum = iList.get(i) + jList.get(i);
if(iList.get(i) >= jList.get(i)) {
count += getAllCombinations(sum, jList.get(i));
}
else {
count += getAllCombinations(sum, iList.get(i));
}
}
return count;
}
public int getAllCombinations(int sum, int value) {
if(value == 0)
return 1;
else if(value == 1)
return sum;
else {
int valueTemp = 1;
long sumTemp = 1;
for(int i = 1;i <= value;i ++) {
valueTemp = valueTemp * i;
sumTemp = sumTemp * sum --;
}
return (int)(sumTemp / valueTemp);
}
}
//法二:通过数学归纳法发现:当n=1时,sum=1;当n=2时,sum=2;当n=3时,sum=3;当n=4时,sum=5;因此是斐波那契数列
public int jumpFloor2(int target) {
if(target == 1)
return 1;
else if(target == 2)
return 2;
else {
int sum0 = 1;
int sum1 = 2;
int result = 0;
for(int i = 3;i <= target;i ++) {
result = sum0 + sum1;
sum0 = sum1;
sum1 = result;
}
return result;
}
}
public static void main(String[] args) {
System.out.println(new JumpFloor().jumpFloor2(5));
}
}
《剑指offer》-一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
最新推荐文章于 2021-06-10 22:55:49 发布