0
点赞
收藏
分享

微信扫一扫

Leetcode509. 斐波那契数列

仲秋花似锦 2022-02-04 阅读 16
算法

题目描述:

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

给定 n ,请计算 F(n)

示例:

提示:

方法一:O(n)空间复杂度

用数组储存重复的子问题答案

class Solution {
public:
    int fib(int n) {
        if(n == 0 || n == 1) return n;
        vector<int>fibtable(32,0);
        fibtable[1] = 1;
        for(int i = 2; i <= n; i++){
            fibtable[i] = fibtable[i - 1] + fibtable[i - 2];
        }
        return fibtable[n];
    }
};

方法二:O(1)空间复杂度

进一步观察可以发现,对于我们想要得到的fib(n),其实只与fib(n - 1) 和fib(n - 2)有关。因此不必存下之前所有的fib(i),只要用三个变量就可以。int a 存储fib(n - 2),int b 存储fib(n - 1),int sum 是传递状态的中间变量。

class Solution {
public:
    int fib(int n) {
        if(n == 0 || n == 1) return n;
        int a = 0;
        int b = 1;
        int sum = 1;
        for(int i = 2; i < n; i++){
            sum = a + b;
            a = b;
            b = sum;
        }
        return a + b;
    }
};

进一步地,其实sum这个中间变量可以省去,此种实现也是最常见的。

class Solution {
public:
    int fib(int n) {
        if(n == 0 || n == 1) return n;
        int a = 0, b = 1;
        for(int i = 2; i < n; i++){
            b = a + b;
            a = b - a;
        }
        return a + b;
    }
};
举报

相关推荐

0 条评论