【剑指offer-08】 跳台阶
- 考点:递归
- 时间限制:1秒
- 空间限制:32768K
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路:
- 对于本题,前提只有 一次 1阶或者2阶的跳法。
- 如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
- 假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
- 由以上两点假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
- 然后通过实际的情况可以得出:
只有一阶的时候 f(1) = 1
只有两阶的时候可以有 f(2) = 2 - 可以发现最终得出的是一个斐波那契数列:
代码:
public class Solution {
public int JumpFloor(int target) {
if (target <= 2) {
return target;
} else {
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
}
我的问题:
虽然很快就写出来,但实际上还是这种递归呢,还是可能会出现堆栈溢出的情况,所以我决定用循环在写在其他思路中。
其他思路:
其实这道题和上一道题的斐波那契数列是一模一样的,但是要算法思想是一样的,所以写循环的时候也可以套用上一次的斐波那契数列的解法。
public class Solution {
public int JumpFloor(int target) {
if (target <= 2) {
return target;
}
int res = 0;
int n1 = 1;
int n2 = 2;
for (int i = 3; i <= target; i++) {
res = n1 + n2;
n1 = n2;
n2 = res;
}
return res;
}
}