【剑指offer】10.1 斐波那契数列

565 阅读1分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 力扣
// 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。
// 斐波那契数列的定义如下:

// F(0) = 0,   F(1) = 1
// F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
// 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两
// 数相加而得出。

// 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008
// ,请返回 1。

题解

// 牛客

//////////////////// 暴力递归法 /////////////////////
// 递归可以,但是很暴力
public class Solution {
    public int Fibonacci(int n) {
        if (n == 1)
            return 1;
        if (n == 0)
            return 0;
		// 根据定义直接递归法
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

////////////////////// 动态规划  /////////////////////
public class Solution {
    public int Fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        int[] f = new int[n + 1];
        f[1] = 1;
		// 从0,1开始,从头推到f[n]
        for (int i = 2; i <= n; i++) { 
            f[i] = f[i - 2] + f[i - 1];   // 循环递推
        }
        return f[n];
    }
}

public class Solution {
    public int Fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        int pre1 = 0, pre2 = 1;
        int f = 0;
        for (int i = 2; i <= n; i++) {
            f = pre2 + pre1;
            pre1 = pre2;
            pre2 = f;
        }
        return f;
    }
}


// 力扣
// 力扣如果用递归方法会发现直接报时间复杂度超了

/////////////////// 动态规划 ////////////////////////
// 执行用时:0 ms , 在所有 Java 提交中击败了 100.00% 的用户
// 内存消耗: 35.2 MB, 在所有 Java 提交中击败了83.53%的用户

class Solution {
	public int fib(int n) {
		int a = 0, b = 1, sum;
		for (int i = 0; i < n; i++) {
			// 答案要求需要取模 1e9+7(1000000007),
			// 如计算初始结果为:1000000008,请返回 1。
			sum = (a + b) % 1000000007;
			a = b;
			b = sum;
		}
		return a;
	}
}