剑指OFFER笔记_10_2_青蛙跳台阶问题_JAVA实现
题目:青蛙跳台阶问题
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
- 这题和斐波那契数列非常类似。
- 跳上1级台阶有1种方法(f(1))。跳上2级台阶有2种方法(1、1和2)。
- 跳上3级台阶(f(3))我们有两种大方向。第一种是第1次只跳上1级台阶,然后考虑剩下(3-1)级台阶有几种跳法(f(1))。第二种是第1次跳上2级台阶,然后考虑剩下(3-2)级台阶有几种跳法(f(2))。
- 以此类推,f(n)=f(n-1)+f(n-2)。只是前几项和斐波那契数列有所不同。
- 斐波那契数列:第0项为0,第一项是1,第二项是1,之后可以按照公式得到。
- 此题:第0项为0,第一项是1,第二项是2,之后也可以按照公式得到,所以对前一题的代码进行稍微的修改即可。
代码
函数主体部分代码
package q10_2;
/**
* 青蛙跳台阶问题
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。
* 求该青蛙跳上一个n级的台阶总共有多少种跳法。
* @author asus
*
*/
public class Solution {
public static int fib(int n) {
//第0项值为0
if(n == 0)
{
return 0;
}
//第1项为1
if(n == 1)
{
return 1;
}
//第2项为2
if(n == 2)
{
return 2;
}
//从第二项开始考虑
//预储存第1项
int fibSmaller = 1;
//预储存第2项
int fibBigger = 2;
int temp = 0;
for(int i = 3; i <= n; i++)
{
temp = (fibSmaller + fibBigger) % 1000000007;
//大项作小项
fibSmaller = fibBigger;
//之前的大项小项和作为大项
fibBigger = temp;
}
return temp;
}
}
测试部分代码
package q10_2;
import q10_2.Solution;
public class TestApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
//求数列中的0-20项
for(int i = 0; i <= 20; i++)
{
System.out.println("数列中第" + i + "个数是: " + Solution.fib(i));
}
}
}
运行结果截图
LeetCode运行截图