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:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
提示:
0 ≤ N ≤ 30

代码1(递归)

class Solution {
public:
    int fib(int N) {
        if(N < 2) return N;
        return fib(N-1)+fib(N-2);
    }
};

结果:

执行用时 :16 ms, 在所有 C++ 提交中击败了25.63%的用户
内存消耗 :8.3 MB, 在所有 C++ 提交中击败了20.37%的用户

代码2(带剪枝递归)

class Solution {
public:
    int fib(int N) {
        if(N < 2) return N;
        vector<int> a;
        a.resize(N+1,-1);
        a[0] = 0;a[1] = 1;
        return function(N,a);
    }
    int function(int i,vector<int>&a)
    {
        if(a[i] != -1)return a[i];
        a[i] =  function(i-1,a)+function(i-2,a);
        return a[i];
    }
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了73.66%的用户
内存消耗 :8.6 MB, 在所有 C++ 提交中击败了5.09%的用户

代码3

class Solution {
public:
    int fib(int N) {
        if(N < 2) return N;
        vector<int> a;
        a.resize(N+1,0);
        a[1] = 1;
        for(int i = 2; i <= N; i++)
        {
            a[i] = a[i-1] + a[i-2];
        }
        return a[N];
    }
   
};

结果:

执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :8.5 MB, 在所有 C++ 提交中击败了7.31%的用户
posted @ 2020-02-24 09:20  曲径通霄  阅读(108)  评论(0编辑  收藏  举报