题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
思路:(采用数学的归纳法)
1。上1级台阶,1种方法;
2。上2级台阶,2种方法;(分别是11,2)
3。上3级台阶,
(a。第一次跳1级台阶,剩下2级台阶,参考"上2级台阶"有几种条法;
b。第一次跳2级台阶,剩下一级参考"上1级台阶"有几种条法)
一共:2+1=3种。即(111,12,21)
4。上n级台阶,
(a。第一次跳1级台阶,剩下n-1级台阶,参考"上n-1级台阶"有几种条法;
b。第一次跳2级台阶,剩下一级参考"上n-2级台阶"有几种条法)
一共:(n-1)+(n-2)种跳法
//递归实现
public int JumpFloor(int target) {
if(target <= 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
return JumpFloor(target-2)+JumpFloor(target-1);
}
牛客网运行:
//迭代实现
public int JumpFloor(int target) {
if(target <= 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
// 用2个指针指向前两次的结果,后面的数为前面2次数的和。
int one = 1;
int two = 2;
int res = 0; //因为不需要保存所有的跳台阶方法,只保存最后一个就行
for(int i=3;i<=target;i++){
res = one + two;
one = two;
two = res;
}
return res;
}
class Solution {
public int climbStairs(int n) {
//容易知道: 转移公式:f(n) = f(n-1) + f(n-2)
if(n == 1){ //初始情况
return 1;
}
int f1 = 1;
int f2 = 2;
for(int i = 3; i <= n; i++){
int f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f2;
}
}