zoukankan      html  css  js  c++  java
  • 【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

    思路:动态规划

    【剑指Offer】面试题10- I. 斐波那契数列

    如果使用递归f[n] = f[n-1] + f[n-2]会有大量重复计算,时间复杂度为O(n^2),使用动态规划使时间复杂度为O(n)。

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int fib(int N) {        
            if (N == 0 || N == 1) {
                return N;
            }
            int f[N+1];
            f[0] = 0;
            f[1] = 1;
            for (int i = 2; i <= N; ++i) {
                f[i] = f[i-1] + f[i-2];
            }
            return f[N];
        }
    };
    

    优化空间复杂度

    因为每个当前值只与前面两个数相关,所以可以利用两个变量优化空间复杂度。
    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        int fib(int N) {        
            if (N == 0 || N == 1) {
                return N;
            }
            int a = 0, b = 1;        
            int res = 0;
            for (int i = 2; i <= N; ++i) {
                res = a + b;
                a = b;
                b = res;
            }
            return res;
        }
    };
    
  • 相关阅读:
    【转载】行走在镜面的边缘
    Marked
    初赛知识
    【连载中】另一个宇宙
    【OI学习注意事项】
    欢迎
    [很杂的杂项] Yes, Prime Minister长难句大赏(持续更新中)
    [题解] HH的项链
    [题解] SP2713&P1415 线段树区间每个数开方+区间和
    [题解]EER1迫害
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12318970.html
Copyright © 2011-2022 走看看