【牛客网-剑指offer-刷题】Day-1 斐波那契数列
题目
大家都知道斐波那契数列,现在要求输入一个正整数n,请你输出斐波那契数列的第n项。
F(0) = 0, F(1) = 1 F(N) = F(N-1) + F(N-2), 其中 N > 1
解法1:递归法
根据斐波那契数列的标准公式,直接写出递归函数:
public class Solution {
public int Fibonacci(int n) {
if(n <= 1){
return n;
} else{
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
}
复杂度 时间复杂度: O ( 2 n ) O(2^n) O(2n) 空间复杂度: O ( 1 ) O(1) O(1)
解法2:优化递归
由于递归会重复计算大量相同的数据,消耗过多的内存,因此,采用将结果存入数组的方式:
public class Solution {
public int Fibonacci(int n) {
int arr[] = new int[n];
arr[0] = 1;
arr[1] = 1;
for(int i = 2; i < n; i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[n-1];
}
}
利用索引,将每个n的值存到对应n-1下标的数组位置中,直接根据下标索引。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n)
解法3:优化存储
对于这个问题来讲,每次只用到了最近的两个数,因此可以指存储最近的两个数的值。
-
sum : 存储第n项的值 one 存储第 n-1 项的值 two 存储第 n-2 项的值
public class Solution {
public int Fibonacci(int n) {
if(n <= 1){
return n;
}
int sum = 0;
int one = 1;
int two = 0;
for(int i = 2; i <= n; i++){
sum = one + two;
two = one;
one = sum;
}
return sum;
}
}
复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1)
解法4:进一步优化
观察上一版发现,sum 只在每次计算第 n 项的时候用一下,其实还可以利用 sum 存储第 n-1 项。 例如当计算完 f(5) 时 sum 存储的是 f(5) 的值,当需要计算 f(6) 时,f(6) = f(5) + f(4),sum 存储的 f(5),f(4) 存储在 one 中,由 f(5)-f(3) 得到。
public class Solution {
public int Fibonacci(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
int sum = 1;
int one = 0;
for(int i=2;i<=n;i++){
sum = sum + one;
one = sum - one;
}
return sum;
}
}
复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1)
上一篇:
Java基础知识总结(2021版)
