剑指offer7_裴波那契数列_题解

裴波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

\[n<=39 \]

示例1

输入

4

返回值

3

分析

方案一:递归

裴波纳契数列公式为:\(f(n) = f(n-1) + f(n-2)\)

/**
时间复杂度:O(2^n)
树的结点个数
空间复杂度:递归栈的空间
**/
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)和递归栈的空间
**/
class Solution {
public:
    int fib[39] = {0};
    int Fibonacci(int n){
        if(n == 0 || n == 1){
            return n;
        }
        if(fib[n] != 0){
            return fib[n];
        }
        return fib[n] = Fibonacci(n - 1) + Fibonacci(n - 2);
    }
};

方案三:动态规划

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(n)
**/
class Solution {
public:
    int Fibonacci(int n){
        int fib[39];
        fib[0] = 0, fib[1] = 1;
        for(int i = 2; i <= n; i++){
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib[n];
    }
};

方案四:方案三优化

只使用3个变量a,b,c

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(1)
**/
class Solution {
public:
    int Fibonacci(int n){
        if(n == 0 || n == 1) return n;
        int a = 0, b = 1, c;
        for(int i = 2; i <= n; i++){
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
};
posted @ 2020-12-06 23:24  RiverCold  阅读(78)  评论(0编辑  收藏  举报