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

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

一、题目

在这里插入图片描述

二、递归,动态规划解法

2.1 递归解法

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

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 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i1]+dp[i2],根据此公式,写出如下代码。
  程序如下

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)

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)

三、完整代码

# 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

相关推荐

  1. Leetcode 509

    2024-01-09 12:52:05       46 阅读
  2. C/C++---------------LeetCode509.

    2024-01-09 12:52:05       47 阅读
  3. Leetcode509——(C语言)

    2024-01-09 12:52:05       29 阅读
  4. 509.

    2024-01-09 12:52:05       64 阅读
  5. LC509.

    2024-01-09 12:52:05       50 阅读
  6. 509.

    2024-01-09 12:52:05       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-09 12:52:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-09 12:52:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-09 12:52:05       87 阅读
  4. Python语言-面向对象

    2024-01-09 12:52:05       96 阅读

热门阅读

  1. 数据结构-怀化学院期末题(56)

    2024-01-09 12:52:05       52 阅读
  2. vue项目中px单位转rem插件

    2024-01-09 12:52:05       63 阅读
  3. 微服务架构+服务注册中心+Nacos和Eureka+比较分析

    2024-01-09 12:52:05       60 阅读
  4. Spring Boot CLI 中文文档

    2024-01-09 12:52:05       66 阅读
  5. 编程语言--C/C++、python

    2024-01-09 12:52:05       49 阅读
  6. C++类模板分文件编写

    2024-01-09 12:52:05       64 阅读
  7. 【复习】人工智能 第一章 绪论

    2024-01-09 12:52:05       50 阅读
  8. 系列一、 单例设计模式

    2024-01-09 12:52:05       56 阅读
  9. 安卓多用户管理之UserManagerService.UserData类

    2024-01-09 12:52:05       62 阅读