题目:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39
思路:
方法一:递归
评价:代码简单,但是运行速度慢;时间复杂度O(2^n),空间复杂度:O(1)

public class Solution {
    public int Fibonacci(int n) {
        if(n==0||n==1) return n;
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

方法二:优化递归 空间换时间
评价:速度快很多;时间复杂度O(n),空间复杂度O(n)

public class Solution {
    public int Fibonacci(int n) {
       int res[]=new int[40];//事先告知n<=36
        res[0]=0;
        res[1]=1;
        for(int i=2;i<=n;i++){
            res[i]=res[i-1]+res[i-2];//数组存下每次的结果
        }
        return res[n];
    }
}

方法三:优化存储 继续优化空间
思路:实际每次只需要存储上一次的第(n-1)个数,以及计算结果
评价:降低了方法二的空间复杂度;时间复杂度O(n),空间复杂度O(1)

public class Solution {
    public int Fibonacci(int n) {
        if(n==0||n==1) return n;
        int first=0;//存储(n-1)值
        int second=1;//存储计算(n)结果
        int sum=0;//存储结果
        for(int i=2;i<=n;i++){
            sum=first+second;
            first=second;
            second=sum;
        }
        return sum;
    }
}

方法四:持续优化存储
思路:其实不需要sum来存储结果,因为second就是结果,那么first=seond-first
评价:时间复杂度O(n),空间复杂度O(1)

public class Solution {
    public int Fibonacci(int n) {
        if(n==0||n==1) return n;
        int first=0;//存储(n-1)值
        int second=1;//存储计算(n)结果
        for(int i=2;i<=n;i++){
            second=first+second;
            first=second-first;
        }
        return second;
    }
}