斐波那契数列

LeetCode 斐波那契数列
题目描述

写一个函数,输入 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。

解法
1、递归法(太耗时,知道,会写,不推荐)

# include 
#include
using namespace std;

int fib(int n)
{
	if (n == 0) return 0;
	else if (n == 1) return 1;
	else 
		return (fib(n - 1) + fib(n - 2)) % 1000000007;
}

int main()
{
	//1、 recusive 
	clock_t start, ends;
	start = clock();
	
	int n,res;
	cin >> n;
	int fib(int); // 规范化还是加上 
	res = fib(n);
	cout << res;
	
	ends = clock();
	cout << ends - start << endl;
	return 0;
	}


2、记忆化递归
原理: 在递归法的基础上,新建一个长度为 nn 的数组,用于在递归时存储 f(0)f(0) 至 f(n)f(n) 的数字值,重复遇到某数字时则直接从数组取用,避免了重复的递归计算。
缺点: 记忆化存储的数组需要使用 O(N)O(N) 的额外空间

3、
由于 dpdp 列表第 ii 项只与第 i-1i−1 和第 i-2i−2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum 使 a, b 两数字交替前进即可

int n;
cin >> n;
start = clock();
//int a, b = 0, 1;
int a = 0, b = 1;
for (int i = 0; i <= n; i++)
	a, b = b, a + b;
cout << a % 1000000007;
class Solution:
    def fib(self, n: int) -> int:
        a, b = 0, 1
        for _ in range(n):
            a, b = b, a + b
        return a % 1000000007

注意返回是 a % 1000000007,,不是 b % 1000000007
手推下,就知道了

4、DP方法

class Solution:
    def fib(self, n: int) -> int:
        # DP
        if n == 0: return 0
        elif n==1 : return 1
        else:
            dp = []
            dp.append(0)
            dp.append(1)
            for i in range(2,n+1):
                dp_m = dp[i-1] + dp[i-2]
                dp_m = dp_m % 1000000007
                dp.append(dp_m)
            return dp[-1]

你可能感兴趣的:(LeetCode简单题)