斐波那契数(LeetCode-509)

简介: 斐波那契数(LeetCode-509)

1. 斐波那契数(LeetCode-509)


题目

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1


给定 n ,请计算 F(n) 。


示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1


示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2


示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3


提示:


0 <= n <= 30


思路

这题很简单,我试着用五部曲练练手


dp[i] 的意义为:第 i 个数的斐波那契数值为 dp[i]

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ]

dp[0]=0 dp[1]=1

根据递推公式可知,dp[i] 依赖它的前两个元素,所以一定是从前往后遍历

推导一下前十项 0 1 1 2 3 5 8 13 21 34 55


代码展示

class Solution
{
public:
    int fib(int n)
    {
        vector<int> dp(35);
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};


但其实还可以优化,因为dp[i] 只依赖它的前两个元素,只需维护两个元素,没有必要写出整个数组,浪费了空间

class Solution
{
public:
    int fib(int n)
    {
        vector<int> dp(3);
        dp[0] = 0;
        dp[1] = 1;
        if (n < 2)
        {
            return dp[n];
        }
        int result;
        for (int i = 2; i <= n; i++)
        {
            result = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = result;
        }
        return result;
    }
};
目录
相关文章
|
6月前
|
Java
leetcode-509:斐波那契数
leetcode-509:斐波那契数
479 0
【剑指offer】-斐波那契数列-07/67
【剑指offer】-斐波那契数列-07/67
|
11月前
leetcode 509 斐波那契数
今天重新看了下动态规划, 它和递归的区别就是,它是自下而上的。 还了解到状态压缩 如果我们发现每次状态转移只需要 DP table 中的一部分,那么可以尝试用状态压缩来缩小 DP table 的大小,只记录必要的数据 于是就刷了这道简答题,用到了状态压缩
38 0
剑指offer-9.斐波那契数列
剑指offer-9.斐波那契数列
45 1
剑指offer 09. 斐波那契数列
剑指offer 09. 斐波那契数列
42 0
LeetCode 172. 阶乘后的零
给定一个整数 n,返回 n! 结果尾数中零的数量。
77 0
斐波那契数列(剑指offer 10-I)
斐波那契数列(剑指offer 10-I)
AcWing 21. 斐波那契数列
AcWing 21. 斐波那契数列
108 0
AcWing 21. 斐波那契数列
AcWing 741. 斐波那契数列
AcWing 741. 斐波那契数列
92 0
AcWing 741. 斐波那契数列