题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法。
考虑一般的情况。n级台阶的跳法为
f(n)
,n>2时,第一次跳有两种不同选择:只跳1级,则后面的跳法为
f(n−1)
;如果第一次跳2级,则后面的跳法为
f(n−2)
,因此总跳法为
f(n)=f(n−1)+f(n−2)
,即斐波那契数列。
牛客AC代码:
public int JumpFloor(int target) {
if(target <= 0)
return 0;
if(target <= 2)
return target;
int f1 = 1;
int f2 = 2;
int fn = 0;
for(int i = 3; i <= target; i++) {
fn = f1 + f2;
f1 = f2;
f2 = fn;
}
return fn;
}
问题扩展:变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
类似于上面的分析,有n中跳法,则:
f(n)=f(n−1)+f(n−2)+f(n−3)+...+f(1)
f(n−1)=f((n−1)−1)+f((n−1)−2)+...+f(1)
=f(n−2)+f(n−3)+...+f(1);
则:
f(n)=2∗f(n−1)
牛客AC代码:
public class Solution {
public int JumpFloorII(int target) {
if(target <= 0)
return 0;
if(target <= 2)
return target;
int f = 2;
int fn = 0;
for(int i = 3; i <= target; i++) {
fn = 2 * f;
f = fn;
}
return fn;
}
}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社