题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题解:
由题可知,青蛙可以跳1级台阶或者2级台阶,当 n >= 2时,
- 第一次跳 1 级,此时跳法的数目等于后面剩下的 n-1 级台阶的跳法数目,即为f(n-1);
- 第一次跳 2 级,此时跳法的数目等于后面剩下的 n-2 级台阶的跳法数目,即为f(n-2)。
也就是说它跳上 n 级台阶的跳法数是跳上 n-1 和跳上 n-2 级台阶的跳法数之和。
即:f(n) = f(n-1)+f(n-2)
跳 1 级台阶的跳为 1 ,跳 2 级台阶的跳法为 2。
最终得到以下递推式:
解法一:递归
public int JumpFloor(int target) {
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
为优化其递归栈的空间,我们可以用迭代和动态规划来解答。
解法二:迭代( 时间复杂度O(n) )
public int JumpFloor(int target) {
if(target <= 2){
return target;
}
int pre1 = 1;
int pre2 = 2;
for(int i = 3;i <= target;i++){
int cur = pre1 + pre2;
pre1 = pre2;
pre2 = cur;
}
return pre2;
}
解法三:动态规划
public int JumpFloor(int target) {
int[] dp = new int[target+1];
dp[0] = dp[1] = 1;
for(int i = 2;i <= target;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[target];
}