题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
n=0, num = 0;
n=1,num = 1;
n=2,num = 1;
n=3,num = 2;
n=4,num = 3;
…
n=k,num = f(k-1)+f(k-2);
此题目注意程序所用时间,直接用递归写法会超时!!!
class Solution {
public:
int Fibonacci(int n) {
int f = 0;
int s = 1;
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}
for(int i = 2;i <=n;i++){
s = s + f;
f = s - f;
}
return s;
}
};
使用动态规划来求解:
用dp数组记录子问题的结果,避免重复计算
//递归写法:
class Solution {
public:
//辅助函数
int solve(vector<int> &dp,int N){
if(N == 1 || N == 2){
return 1;
}
if(dp[N] != 0){
return dp[N];
}else{
dp[N] = solve(dp,N - 1) + solve(dp,N - 2);
return dp[N];
}
}
//斐波那契数列函数
int Fibonacci(int N) {
if(N <= 0){
return 0;
}
vector<int> dp(N + 1,0);
return solve(dp,N);
}
};
动态规划迭代写法:
int Fibonacci(int N) {
if(N <= 0){
return 0;
}
vector<int> dp(N + 1, 0);
// base case
dp[1] = dp[2] = 1;
for (int i = 3; i <= N; i++)
dp[i] = dp[i - 1] + dp[i - 2];
return dp[N];
}