题解思路
- 暴力,简单的递归
- 优化递归算法_1
- 由于我们一直输入的n<=39,所以我们可以打个表
- 将前40项的结果存在数组中,减少方法1中的重复计算
- 优化递归算法_2
- 虽然方法2的计算次数减少了,但是我们多开辟了39个空间,造成浪费
- 我们支开辟每次参与运算的两个数的空间,减少空间浪费
Java
1、暴力
public class Solution {
public int Fibonacci(int n) {
if(n<=1){
return n;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
2、优化递归_1
public class Solution {
public int Fibonacci(int n) {
int [] ans = new int [40];
ans[0]=0;
ans[1]=1;
for(int i = 2;i<40;i++){
ans[i]=ans[i-1]+ans[i-2];
}
return ans[n];
}
}
3、优化递归_2
public class Solution {
public int Fibonacci(int n) {
if( n == 0){
return 0;
}else if(n == 1){
return 1;
}
int sum = 0;
int one = 0;
int two = 1;
for(int i = 2;i<=n;i++){
sum=one+two;
one = two;
two = sum;
}
return sum;
}
}
Python
1、暴力(这个是过不了的,时间太长了)只要了解思路即可,直接跳到第二个
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
if n<=1:
return n;
return self.Fibonacci(n-1)+self.Fibonacci(n-2);
# write code here
2、优化递归_1
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
a = [0,1];
for i in range(2,40):
a.append(a[i-1]+a[i-2]);
return a[n];
# write code here
3、优化递归_2
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
a = 0;
b = 1;
for i in range (n):
a,b = b, a+b;
return a;
# write code here
注意,我们在平时做题的时候不提倡暴力,但是在比赛过程中还是可以使用的
同样如果你们纠结到底是优先考虑时间效率还是空间效率,那肯定是时间效率
我们一贯的做法是牺牲空间来换取时间(一个最简单的例子就是一些超大型计算机),前人们优先追求的是时间上的优化,当然二者兼顾最好