我的妈呀,一道题折磨我一个小时了
题目描述:
形如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; }
越努力,越幸运。