题目描述(跳台阶)JumpFloorI
青蛙一次可以跳 上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
递归:
斐波拉契数列的应用,n是台阶数,n=0输出1,n=1输出1,n=2输出2,n=3输出4…(0 <= n <= 100,这里台阶数是0时,也输出1)
青蛙跳到终点的最后一次跳跃有两种情况:
1、最后再跳1个台阶刚好到达终点
2、最后再跳2个台阶刚好到达终点
总的跳法:第一种情况的跳法+第二种情况的跳法
最后跳1个台阶,JumpFloor(n)跳法等于前(n-1)个台阶的跳法数JumpFloor(n-1)
最后跳2个台阶,JumpFloor(n)跳法等于前(n-2)个台阶的跳法数JumpFloor(n-2)
总的跳法:JumpFloor(n)=JumpFloor(n-1)+JumpFloor(n-2)
既斐波拉契数列的递归
public int JumpFloor(int n) {
if (n == 0 || n == 1) {
return 1;
}
return JumpFloor(n-1)+JumpFloor(n-2);
}
非递归写法
public int JumpFloor(int n) {
if (n == 0 || n == 1) {
return 1;
}
int l = 1;
int r = 1;
int temp = 0;
for (int i = 2; i <= n; i++) {
temp = l + r;
l = r;
r = temp;
}
return temp;
}
题目描述(变态跳台阶)JumpFloorII
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
输入:3
输出:4
解法1:
类似青蛙跳台阶思路,此时青蛙的最后一步可以是跳1,2…n个台阶到达终点,则总的跳法
JumpFloorII(n)=JumpFloorII(n-1)+JumpFloorII(n-2)+JumpFloorII(n-3)+…+JumpFloorII(2)+JumpFloorII(1)+JumpFloorII(0)
数组count[i]保存到达第i个台阶时的总的跳法
public int jumpFloorII(int n) {
int[] count = new int[n + 1];
count[0] = 1;
count[1] = 1;
for (int i = 2; i < count.length; i++) {
for (int j = 0; j < i; j++) {
count[i] += count[j];
}
}
return count[n];
}