算法思路
由于青蛙在每一层台阶都只存在两种跳法:选择跳一级还是两级。那么假设跳上n级台阶有F(n)中跳法,很容易就可以写出递推公式
F(n) = F(n - 1) + F(n - 2);
这不就是动态规划中的状态转移方程么,因此代码就很容易写出来了。
算法实现一
首先用递归方式实现:
public class Solution {
public int jumpFloor(int target) {
if (target <= 1) {
return 1;
}
return jumpFloor(target - 1) + jumpFloor(target - 2);
}
} 这种方式有个很严重的问题就是存在重复计算问题:每次计算出F(n)后都没有保存,下次还得重新计算,因此就有下面这个版本。
算法实现二
要在计算过程中,保存计算过的值,那么就不能从n到1递归计算了,而应该是从1到n搜索,这便是记忆化搜索:
public class Solution {
public int jumpFloor(int target) {
if (target <= 1) {
return 1;
}
// 数组A保存跳n级台阶存在的跳法数量
int[] A = new int[target + 1];
A[0] = A[1] = 1;
for (int i = 2; i <= target; i++) {
A[i] = A[i - 1] + A[i - 2];
}
return A[target];
}
} 
京公网安备 11010502036488号