• 【剑指offer】9.斐波那契数列


    9.斐波那契数列

    写一个函数,输入 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

    1.使用递归

    递归的使用就是将一个大问题分解成多个子问题进行递归解决。

      public int fib(int n) {
                if(n<=1){
                    return  n;
                }
        
                return fib(n-1)+fib(n-2);
            }
    

    问题 递归调用的过程中会出现重复计算的子问题。当递归调用栈的深度超过系统栈 就会出异常。

    2记忆化递归法

    动态规划的思想也是将大问题化解成多个子问题,但是动态规划会将重复计算的子问题的解存储起来。这样避免了重复计算带来的性能开销。

       public int fib(int n) {
                if(n<=1){
                    return n;
                }
        
                int [] fib = new int [n+1];
         
                fib[1] = 1;
                for(int i=2;i<=n;i++){
                    fib[i] = fib[i-1]+fib[i-2];
                }
                return fib[n];
            }
    

    3.动态规划

    分析一下 空间复杂度是O(n)

    public int Fibonacci(int n) {
        if (n <= 1)
            return n;
        int pre2 = 0, pre1 = 1;
        int fib = 0;
        for (int i = 2; i <= n; i++) {
            fib = pre2 + pre1;
            pre2 = pre1;
            pre1 = fib;
        }
        return fib;
    }
    

    空间复杂度由O(n)降低到O(1)

    4.循环求余法

    class Solution {
        public int fib(int n) {
            int a = 0, b = 1, sum;
            for(int i = 0; i < n; i++){
                sum = (a + b) % 1000000007;
                a = b;
                b = sum;
            }
            return a;
        }
    }
    

    时间复杂度 O(N) : 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) 。

    空间复杂度 O(1) : 几个标志变量使用常数大小的额外空间。

  • 相关阅读:
    分享一个网上搜不到的「Redis」实现「聊天回合制」的方案
    【转】Python函数装饰器原理与用法详解
    java后台过滤vue前台传的空字符串
    uniapp项目 引用uview与配置
    微信 JSSDK 配置wx.config
    MySQL 的 JSON 格式字段用法
    MySQL 的 limit 深分页问题
    MyBatis 的 #{} 和 ${} 的使用场景
    SpringCloudAlibaba学习(二):Nacos注册中心
    Jackson转换时间字符串为LocalDateTime类型报错解决
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860677.html
Copyright © 2020-2023  润新知