斐波那契数列
斐波那契数列
题目链接
牛客网
题目描述
描述
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
数据范围:1≤n≤39
要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法
输入描述:
一个正整数n
返回值描述:
输出一个正整数
实例1
输入: 2
返回值:1
实例2
输入: 4
返回值: 3
解法(2种)
第一种:递归方式 O(2n)
public static int fibonacci(int n) {
if(n <= 2){
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}
第二种:优化存储的方式 O(n)
分析:
其实我们可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数
sum存储第 n 个的值 one存储第 n-1 个的值 two存储第 n-2 个的值
public static int fibonacci2(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
int sum = 0;
int two = 0;
int one = 1;
for(int i=2;i<=n;i++){
//把第n-1个值和第n-2个值的和相加就等于第n个的值
sum = two + one;
//把第n-1个的值赋值给第n-2个的
two = one;
//把第n个的值赋值给第n-1
one = sum;
}
return sum;
}