【剑指offer】跳台阶-Java实现
1. 递归法
1. 分析
思路:跳n级台阶相当于n-1和n-2级台阶的和,因为n级台阶就相当于n-1级再跳一次一阶的和n-2级再跳一次2阶的。
斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
跳台阶为变形斐波那契公式为:F(1)=1,F(2)=2, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
根据公式:
2. 代码
public class Solution {
public int JumpFloor(int target) {
if (target <= 2){
return target;
}
return JumpFloor(target-1) + JumpFloor(target-2);
}
}
2.迭代
1. 分析
本质上还是斐波那契数列,所以迭代也可以求 当成 dp 问题来想的话:首先分析问题,它最终解是由前面的解累积起来的解,如何缩小问题的规模?
首先可知,
第一阶有只能一步,1种;
第二阶可以两次一步、一次两步, 2种
若楼梯阶级 n = 3
跳 2 步到 3:剩下的是第一步没跳,起始跳到第一步只有一种
跳 1 步到 3:剩下的是第二步没跳,起始跳到第二步有两种
通过分类讨论,问题规模就减少了:
若楼梯阶级 n = n
跳 2 步到 n:剩下的是第 n - 2 步没跳,起始跳到第 n - 2 步设它为 F(n-2) 种
跳 1 步到 n:剩下的是第 n - 1 步没跳,起始跳到第 n - 1 步设它为 F(n-1) 种
同时可以发现第 n 阶的解法,只要用到 n - 1 和 n - 2 阶是多少,其他的不用考虑,因此用两个变量临时存下来即可 dp(i) = dp(i-2) + dp(i-1)
2. 代码
public class Solution {
public int JumpFloor(int target) {
if (target <= 2){
return target;
}
int JumpNum[] = new int[100];
JumpNum[1] = 1;
JumpNum[2] = 2;
for (int i = 3;i <= target;i++){
JumpNum[i] = JumpNum[i-1] + JumpNum[i-2];
}
return JumpNum[target];
}
}