【牛客网-剑指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版)