题目详情
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
示例 1:
输入:输入:n = 5
输出:5
Java代码(暴力递归)
class Solution {
public int fib(int n) {
if(n == 0){
return 0;
}else if (n == 1){
return 1;
}
return fib(n-1) + fib(n-2);
}
}
这个应该没啥可说的,在leetcode上面会超出时间限制,时间复杂度是2的n次幂
暴力递归.png
Java代码(数组去重)
public int fib(int n) {
int[] arr = new int[n + 1];
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i <= n;i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[n];
}
Java代码(去重递归)
class Solution {
public static int fib(int n) {
int[] arr = new int[n + 1];
return recurse(arr,n);
}
private static int recurse(int[] arr,int n){
if(n == 0){
return 0;
}
if(n == 1){
return 1;
}
if(arr[n] != 0){
return arr[n];
}
arr[n] = recurse(arr,n-1) + recurse(arr,n-2);
return arr[n];
}
}
Java代码(动态规划 && 双指针)
class Solution {
public static int fib(int n) {
int slow = 0;
int fast = 1;
int temp = 0;
if(n == 0){
return slow;
}
for(int i = 2;i <= n;i++){
temp = slow + fast;
slow = fast;
fast = temp;
}
return fast;
}
}
总结
因为时间复杂度高是因为重复计算了相同的元素位数,所以可以考虑使用数组来保存计算出的元素,这样就可以降低时间复杂度。
但是使用去重会引入一个数组,所以增加了空间复杂度。但实际上我们只需要两位就可以知道下一位是什么。而不是需要计算出整个数组,所以有了第三种算法,至引入两个指针,一直向右移动来计算下一位