剑指 Offer——8. 跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
问题分析
设f(n)表示青蛙跳上n级台阶的跳法数。当只有一个台阶时,
即n = 1时, 只有1中跳法;
当n = 2时,有两种跳法;
当n = 3 时,有3种跳法;
当n很大时,青蛙在最后一步跳到第n级台阶时,有两种情况:
一种是青蛙在第n-1个台阶跳一个台阶,那么青蛙完成前面n-1个台阶,就有f(n-1)种跳法,这是一个子问题。
另一种是青蛙在第n-2个台阶跳两个台阶到第n个台阶,那么青蛙完成前面n-2个台阶,就有f(n-2)种情况,这又是另外一个子问题。
两个子问题构成了最终问题的解,所以当n>=3时,青蛙就有f(n)=f(n-1)+f(n-2)种跳法。
递归实现:O(n2) O(n)
public class Solution {
public int JumpFloor(int target) {
if(target == 1 || target ==2) {
return target;
}else{
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
}
迭代实现 O(n) O(1)
可以使用一个数来保存之前计算的结果,防止重复计算
public class Solution {
public int JumpFloor(int target) {
if (target <= 0) {
return 0;
}
if (target == 1) {
return 1;
}
if (target == 2) {
return 2;
}
int first = 1;
int second = 2;
int third = 0;
for(int i = 3; i <= target; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
动态规划 O(n) O(n)
public class Solution {
public int JumpFloor(int target) {
if (target <= 2) {
return target;
}
int[] dp = new int[target + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= target; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[target];
}
}