描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1
输入: 2
返回值: 2
示例2
输入: 7
返回值: 21
思路1:
斐波那契数列,递归,数组dp 保存已经求过的值,减少重复计算
时间复杂度:O(n), 没有重复的计算
空间复杂度:O(n)和递归栈的空间
代码1
public class Solution {
public int jumpFloor(int target) {
int [] dp = new int[target + 1];
return fib(target, dp);
}
private int fib(int target, int [] dp) {
if(target <= 1) {
return 1;
}
if(target == 2) {
return 2;
}
if(dp[target] != 0) {
return dp[target];
}
int res = jumpFloor(target-1) + jumpFloor(target-2);
dp[target] = res;
return res;
}
}
思路2:
斐波那契数列,自底向上,动态规划压缩
时间复杂度:O(n)
空间复杂度:O(1)
代码2
public class Solution {
public int jumpFloor(int target) {
if(target == 0) {
return 0;
}
if(target == 1) {
return 1;
}
if(target == 2) {
return 2;
}
int fibMinOne = 2;
int fibMinTwo = 1;
int res = 0;
for(int i = 3; i <= target; i++){
res = fibMinOne + fibMinTwo;
fibMinTwo = fibMinOne;
fibMinOne = res;
}
return res;
}
}