您的位置:首页 > Web前端

剑指offer(9):跳台阶问题

2016-04-25 11:10 411 查看
题目描述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析:

这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法。

考虑一般的情况。n级台阶的跳法为f(n)f(n),n>2时,第一次跳有两种不同选择:只跳1级,则后面的跳法为f(n−1)f(n-1);如果第一次跳2级,则后面的跳法为f(n−2)f(n-2),因此总跳法为f(n)=f(n−1)+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) = 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-1) = f((n-1)-1) + f((n-1)-2) + ... + f(1)

          =f(n−2)+f(n−3)+...+f(1);= f(n-2) + f(n-3) + ... + f(1);

          

    则:f(n)=2∗f(n−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名企面试官精讲典型编程题(纪念版),电子工业出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: