其他分享
首页 > 其他分享> > DP动态规划之斐波那契数

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