算法思路
由于青蛙在每一层台阶都只存在两种跳法:选择跳一级还是两级。那么假设跳上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]; } }