题目来源:https://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&&tqId=11161&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题解
解题思路:
F(0)=0
F(1)=1
F(2)=2
F(3)=F(2)+F(1),3级台阶可以从1台阶跳2级,也可以从2台阶跳1级
F(n)=F(n-1)+F(n-2)
代码实现
/**
* 方法1:自底向上,直接递归
*/
public class Solution {
public int JumpFloor(int target) {
if (target <= 0) {
return 0;
} else if (target == 1) {
return 1;
} else if (target == 2) {
return 2;
} else {
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
}
/**
* 方法2:自顶向下,动态规划递归,添加一个map记录F(n-1)和F(n-2),不用每次F(n)都要重新计算F(n-1)和F(n-2)
*/
import java.util.HashMap;
public class Solution {
private static HashMap<Integer, Integer> map = new HashMap<>();
public int JumpFloor(int target) {
if (target <= 0) {
map.put(target, 0);
return 0;
} else if (target == 1) {
map.put(target, 1);
return 1;
} else if (target == 2) {
map.put(target, 2);
return 2;
}
if (map.containsKey(target)) {
return map.get(target);
} else {
int result = JumpFloor(target - 1) + JumpFloor(target - 2);
map.put(target, result);
return result;
}
}
}
/**
* 方法3:自底向上,动态规划
*/
public class Solution {
public int JumpFloor(int target) {
if (target <= 0) {
return 0;
} else if (target == 1) {
return 1;
} else if (target == 2) {
return 2;
}
int[] memo = new int[target + 1];
memo[0] = 0;
memo[1] = 1;
memo[2] = 2;
for (int i = 3; i <= target; i++) {
memo[i] = memo[i - 1] + memo[i - 2];
}
return memo[target];
}
}