一、题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
二、解题思路
(1)递归思路:先初始化出前连个数字,再递归求第n个数
(2)动态规划:用备忘录记下来放到数组中,可以降低时间复杂度,又分为两种:自顶向下和自底向上。
(3)用迭代法:用循环求出第n个数
三、可运行java代码
package 剑指offer;
import java.io.File;
/**
* @description: 求斐波那契额数列第n项
*/
/*
* 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
*/
public class Solution_7 {
//方法一:常规方法,用递归求解 复杂度为:2的n次方
public int Fibonacci(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
//方法二:用动态规划,自底向上,复杂度从指数级降为多项式级 时间复杂度为:n 空间复杂度为:n
int fib[] = new int[39];
public int Fibonacci_1(int n) {
if(n==0) return 0;
if(n==1) return 1;
fib[0]=1;
fib[1]=1;
for(int i=2;i<n;i++){
fib[i]=fib[i-1]+fib[i-2];
}
return fib[n-1];
}
//方法三:用动态规划,自顶向下,复杂度从指数级降为多项式级 时间复杂度为:n 空间复杂度为:n
int fib1[] = new int[39];
public int Fibonacci_2(int n){
if(n==1) return 1;
if(n==2) return 1;
if(fib[n]!=0) return fib[n];
return Fibonacci(n-1)+Fibonacci(n-2);
}
//方法四:进一步改进 时间复杂度为:n 空间复杂度为:1
public int Fibonacci_3(int n){
int a=0,b=1,sum=0,i;
if(n==1||n==2){
return 1;
}
for(i=1;i<n;i++){
sum = a+b;
a=b;
b=sum;
}
return sum;
}
public static void main(String[] args) {
Solution_7 s = new Solution_7();
System.out.println(s.Fibonacci_3(1));
}
}