力扣:509. 斐波那契数

题目描述

斐波那契数(通常用 F(n) 表示)形成的序列称为斐波那契数列 。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定n,请计算 F(n) 。

问题分析

本文列举五种解题方法:递归法,递归优化版,迭代法,动态规划法,动态规划法优化版。

代码实现

// 编程软件:VS2019
// 参考书籍:代码随想录
#include
#include
using namespace std;

// 递归法: 时间复杂度O(2^n),空间复杂度O(n)
int fib1(int n) {
	if (n <= 0)return 0;
	if (n == 1) return 1;
	return fib1(n - 1) + fib1(n - 2);
}

// 递归法优化版:时间复杂度O(n),空间复杂度O(n)
int f(int first, int second, int n) {
	if(n <= 0) return 0;
	if(n < 3) {
		return 1;
	}else if (n == 3) {
		return first + second;
	}else {
		return f(second, first + second, n - 1);
	}
}
int fib2(int n) {
	return f(1, 1, n);
}

// 迭代法:时间复杂度O(n),空间复杂度O(1)
int fib3(int n) {
    int first = 0, second = 1, three = 1;
    if (n == 0) return 0;
    if (n == 1) return 1;
    while (n-- > 1){
        three = first + second; // 将前二个加起来赋给第三个
        first = second; // 将三个中第一个赋给第二个
        second = three; // 第三个赋给第二个
    }
    return three;
}

// 动态规划法:时间复杂度O(n),空间复杂度O(n)
int fib4(int n) {
	if (n <= 1) return n;
	vector<int> dp(n + 1);
	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(1)
int fib5(int n) {
	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 res = fib5(10);
	cout << res;
}
// 结果:55

你可能感兴趣的:(leetcode,c++,算法,leetcode)