求斐波那契数列的第n个数,时间复杂度O(n)、空间复杂度O(1)(2021/1/15)

这篇博客探讨了如何使用迭代方法优化斐波那契数列的计算,实现了时间复杂度为O(n)、空间复杂度为O(1)的解决方案。通过三种不同的算法实现,包括递归、动态内存分配和迭代优化,展示了算法效率的提升。最后,代码示例展示了如何在C++中实现这一优化,强调了优化时间和空间复杂度的重要性。
摘要由CSDN通过智能技术生成

题目

求斐波那契数列的第n个数,时间复杂度O(n)、空间复杂度O(1)。

#include<iostream>
#include<cstdlib>
using namespace std;
//斐波那契数列递归算法
//功能求斐波那契数列第n个元素 
int Fib1(int n){ 
	if(n<1){
		return -1;
	}
	if(n==1||n==2){
		return 1;
	}else{
		return Fib1(n-1)+Fib1(n-2);
	}
} 
int* Fib2(int n){
	if(n<1){//判断n是否合法 
		return NULL;
	}	
	//使用动态内存申请表 
	int *list=(int*)malloc(sizeof(int)*(n+1));//申请表长为n+1 下标为0空间不使用
	list[1]=1;
	list[2]=1;
	//开始迭代计算
	int i=3;
	for(i=3;i<=n;i++){
		list[i]=list[i-1]+list[i-2];
	} 
	return list;
}
int Fib3(int n){
	if(n<1){//判断n是否合法 
		return -1;
	}
	if(n==1||n==2){
		return 1;
	}
	int i=1,v1=1,v2=1;
	//迭代的妙处
	for(i=3;i<=n;++i){
		v2=v1+v2;
		v1=v2-v1;
	}
	return v2;
}
int main(int argc,char**argv){
	cout<<Fib1(15)<<endl;
	//我们会发现这样的算法复杂度极大、如果我们计算Fib1(101)估计要计算一年
	//能不能进行时间复杂度上的优化?
	//这样的问题出在我们每计算一次都要从n递归到1,我们并没有记录中间的所记录的斐波那契数
	//我们进行下一步的改进:详情看Fib2函数 
	//使用Fib2
	int *list=Fib2(15);
	if(list){
		cout<<list[15]<<endl;
		free(list);//释放list空间	
	} 
	//可见时间上我们进行了可见的优化,能不能进行再优化?
	//时间复杂度我们优化到了O(n),空间复杂度也为O(n)
	//我们只需要获得数列第n项的和,完全没有必要去记录1~n-1的数列值
	//这样我们就可以将空间复杂度进行优化:请看Fib3()
	cout<<Fib3(15)<<endl;
	cout<<"Change the world and yourself with code. Hold on, hold on.\n";
	return 0;
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高万禄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值