【算法与数据结构】509、LeetCode斐波那契数

文章目录

所有的LeetCode题解索引,可以看这篇文章------【算法和数据结构】LeetCode题解

一、题目

二、递归,动态规划解法

2.1 递归解法

  思路分析:斐波那契数列可以用递归实现,下面直接给出代码,非常简单。递归的代码简单,但是递归的速度很慢,因为递归代码中的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。

  程序如下:

cpp 复制代码
class Solution {
public:
	int fib(int n) {		// 1 1 2 3 5 8 13 21
		if (n <= 1) return n;
		return fib(n - 1) + fib(n - 2);
	}
};

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),一个fib(n)时间复杂度为 O ( ( 1 + n ) ∗ n / 2 ) = O ( n 2 ) O((1+n)*n/2)=O(n^2) O((1+n)∗n/2)=O(n2)。
  • 空间复杂度: O ( n ) O(n) O(n),递归中栈所需的空间。

2.2 动态规划解法

  思路分析:动态数组为 d p i = d p i − 1 + d p i − 2 dpi = dpi - 1 + dpi - 2 dpi=dpi−1+dpi−2,根据此公式,写出如下代码。

  程序如下:

cpp 复制代码
class Solution {
public:
	int fib(int n) {		// 1 1 2 3 5 8 13 21
		if (n <= 1) return n;
		vector<int> dp(n + 1);	// 动态规划中的dp数组
		dp[0] = 0;
		dp[1] = 1;
		for (int i = 2; i <= n; i++) {
			dp[i] = dp[i - 1] + dp[i - 2];
		}
		return dp[n];
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)。
  • 空间复杂度: O ( n ) O(n) O(n)。

  但是实际上,我们可以看到计算斐波那契数列只需要用到两个值,不必保留整个动态数组。因此对上述代码进行内存优化,空间复杂度从 O ( n ) O(n) O(n)变成 O ( 1 ) O(1) O(1)。

cpp 复制代码
class Solution {
public:
	int fib(int n) {		// 1 1 2 3 5 8 13 21
		if (n <= 1) return n;
		int dp[2];
		dp[0] = 0;
		dp[1] = 1;
		for (int i = 2; i <= n; i++) {
			int sum = dp[0] + dp[1];
			dp[0] = dp[1];
			dp[1] = sum;
		}
		return dp[1];
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)。
  • 空间复杂度: O ( 1 ) O(1) O(1)。

三、完整代码

cpp 复制代码
# include <iostream>
# include <vector>
using namespace std;

//class Solution {
//public:
//	int fib(int n) {		// 1 1 2 3 5 8 13 21
//		if (n <= 1) return n;
//		return fib(n - 1) + fib(n - 2);
//	}
//};

//class Solution {
//public:
//	int fib(int n) {		// 1 1 2 3 5 8 13 21
//		if (n <= 1) return n;
//		vector<int> dp(n + 1);	// 动态规划中的dp数组
//		dp[0] = 0;
//		dp[1] = 1;
//		for (int i = 2; i <= n; i++) {
//			dp[i] = dp[i - 1] + dp[i - 2];
//		}
//		return dp[n];
//	}
//};

class Solution {
public:
	int fib(int n) {		// 1 1 2 3 5 8 13 21
		if (n <= 1) return n;
		int dp[2];
		dp[0] = 0;
		dp[1] = 1;
		for (int i = 2; i <= n; i++) {
			int sum = dp[0] + dp[1];
			dp[0] = dp[1];
			dp[1] = sum;
		}
		return dp[1];
	}
};

int main() {
	int n = 4;
	Solution s1;
	int result = s1.fib(n);
	cout << result << endl;
	system("pause");
	return 0;
}

end

相关推荐
爱刷碗的苏泓舒4 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽6 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米7 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠7 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA9 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel9 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客9 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
风栖柳白杨9 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试
闪电悠米11 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
栋***t11 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构