题目链接
509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
这种题在学语言学习的时候都会了解的(谭浩强的C++、数据结构等等教材)
通俗递归解法
int fib(int N) {
if (N == 0 || N == 1) {
return N;
}
return fib(N - 1) + fib(N - 2);
}
上面这种做法时间复杂度很高,可能N>100时,时间就达到5秒以上了(指数级别2^n次方)
如果利用动态规划,先得递推公式,求出dp数组
空间:O(n)
int fib(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(1)
int fib(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];
}
还有一道类似的题可以练手
1137. 第 N 个泰波那契数 - 力扣(LeetCode) (leetcode-cn.com)
代码实现如下
int tribonacci(int n) {
int tmp[3]={0,1,1};
for (int i = 3; i <= n; i++)
tmp[i%3]=tmp[0]+tmp[1]+tmp[2];
return tmp[n%3];
}