斐波那契数列
斐波那契数列
https://www.nowcoder.com/questionTerminal/d143f3c5c54742768cb5406feed56414
我的妈呀,一道题折磨我一个小时了
题目描述:
形如1, 1, 2, 3, 5, 8, 13, 21, 34, 55的数列,后一位是前面两位相加(斐波那契数列),写出函数要求找到第 N 位是多少,如:fib(3) => 3 , fib(5) => 8, 要求时间复杂度为O(n)。
输入描述:
输入一个正整数N(0<=N<=50)
输出描述:
输出第n项的数值
示例1:
输入3
输出3
注意到和剑指offer的区别了嘛,本题的斐波那契数列是从1开始的,而我们所知道的都是从0开始的。
而且这个的N的范围是0-50,在N=50的时候是一个超出int范围的数,那时候该怎么处理呢。
第一个代码:模仿动态规划的DP Table
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
if(n==1)return 1;
vector<long long> dp(n+2,0);
dp[1]=1;
for(int i=2;i<=n+1;i++)
dp[i]=dp[i-1]+dp[i-2];
cout<<dp[n+1];
return 0;
}第二种代码
#include<iostream>
#include<vector>
using namespace std;
long long help(int n) {
if (n == 1) return 1;
vector<long long> result(n + 2, 0);
result[1] = 1;
for (int i = 2; i <= n+1; ++i) {
result[i] = result[i - 1] + result[i - 2];
}
return result[n+1];
}
int main()
{
int n;
cin >> n;
long long result = help(n);
cout << result;
return 0;
}越努力,越幸运。
查看13道真题和解析