zoukankan      html  css  js  c++  java
  • 【剑指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) : 几个标志变量使用常数大小的额外空间。

  • 相关阅读:
    实验四——多分支结构及本章总结
    实验五——循环结构学习总结
    实验12——指针的基础应用 2
    实验11——指针的基础应用
    实验十——一维数组的定义及引用
    实验九——基本数据类型存储及应用总结
    实验八——函数定义及调用总结
    实验七——函数定义及调用总结
    实验六——循环结构程序练习总结
    实验五——循环结构学习总结
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860677.html
Copyright © 2011-2022 走看看