zoukankan      html  css  js  c++  java
  • 面试题10- I:斐波那契数列(C++)

    题目地址:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/

    题目描述

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

    F(0) = 0,   F(1) = 1,F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
    斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回1.

    题目示例

    示例 1:

    输入:n = 2
    输出:1
    

    示例 2:

    输入:n = 5
    输出:5

    解题思路

    (a+b)%c=(a%c+b%c)%c

    思路1:使用递归思想,将f(n)问题拆分成f(n-1)和f(n-2)问题,其中递归结束条件为f(0)和f(1)。当然,直接使用递归方法会产生超时,所以我们用记忆化递归方法,即在递归法基础之上,新建一个长度为n的数组,用于在递归时存储f(0)至f(n)的数,重复遇到一个数时,则直接从数组arr中取用,避免了重复的递归计算,不过需要额外的空间。空间复杂度O(N)

    思路2:动态规划,声明大小为n++1+1的数组arr,并初始化为0,需要注意的是n+1+1中第一个+1是存储0至n,即总共n+1个数据,第二个+1是考虑n等于0的情况,保证数组arr不会产生越界的问题。

    思路3:常规思路,变量pre记录前一个值,res记录当前结果的值,循环遍历求和,如果求和结果大于边界值1000000007,则取模。空间复杂度O(1)

    程序源码

    记忆递归

    class Solution {
    public:
        int fib(int n) {
            if(n == 0) return 0;
            if(n == 1) return 1;
            int arr[200];
            arr[0] = 0, arr[1] = 1;
            for(int i = 2; i <= n; i++)
            {
                arr[i] = (arr[i - 1] + arr[i - 2]) % 1000000007;
            }
            return arr[n];
        }
    };

    动态规划

    class Solution {
    public:
        int fib(int n) {
            if(n < 2) return n;
            int pre2 = 0, pre1 = 1;
            int fab = 0;
            for(int i = 2; i <= n; ++i)
            {
                fab = pre2 + pre1 >= 1000000007 ? (pre2 + pre1) % 1000000007:pre2 + pre1;
                pre2 = pre1;
                pre1 = fab;
                
            }
            return fab;
        }
    };

    常规思路

    class Solution {
    public:
        int fib(int n) {
            vector<int> arr(n + 1 + 1, 0);
            arr[1] = 1; //存放结果
            for(int i = 2; i < n + 1; i++)
            {
                arr[i] = (arr[i - 1] + arr[ i - 2]) % 1000000007;
            }
            return arr[n];
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    HashMap与ArrayList的相互嵌套
    Mysql与Oracle 的对比
    什么是子查询
    创建存储过程
    cmd 快捷键
    navicat 快捷键
    Mysql的数据类型 6种
    Mysql与Oracle 的使用区别
    怎样修复ie浏览器
    Linux官方内置Bash中新发现一个非常严重安全漏洞
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12701230.html
Copyright © 2011-2022 走看看