DP动态规划之斐波那契数
作者:互联网
https://leetcode-cn.com/problems/fibonacci-number/
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
在学校的时候课本上用这个题目介绍了递归,我们看下
int fib(int n) {
if (n < 2) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
在递归的过程中,我们对fib(n)都进行了两次重复计算,导致时间复杂度达到了2^n
我们先优化一下这里的重复计算,对每次计算的结果都存下来,下一次遇到重复问题就直接查表,不再重复计算
int fib(int n) {
if (n < 2) {
return n;
}
vector<int> dp(n + 1, 0);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
这样虽然把时间复杂度降到了n,但是空间复杂度也是n,我们再优化一下这里的结果存储,我们只存储需要的最终结果,中间状态都不要
int fib(int n) {
if (n < 2) {
return n;
}
int n0 = 0;
int n1 = 1;
int n2 = 1;
for (int i = 2; i <= n; i++) {
n2 = n0 + n1;
n0 = n1;
n1 = n2;
}
return n2;
}
这样就把空间复杂度降到了1
标签:契数,return,int,复杂度,fib,之斐波,DP,n1,dp 来源: https://blog.csdn.net/peng314899581/article/details/120638716