斐波那契数列


斐波那契数列

题目链接

牛客网

题目描述

描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

数据范围:1≤n≤39

要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法

输入描述:

一个正整数n

返回值描述:

输出一个正整数

实例1

输入: 2

返回值:1

实例2

输入: 4

返回值: 3

解法(2种)

第一种:递归方式 O(2n)

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

第二种:优化存储的方式 O(n)

分析:

其实我们可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数

sum存储第 n 个的值 one存储第 n-1 个的值 two存储第 n-2 个的值

public static int fibonacci2(int n) {
        if(n == 0){
            return 0;
        }else if(n == 1){
            return 1;
        }
        int sum = 0;
        int two = 0;
        int one = 1;
        for(int i=2;i<=n;i++){
            //把第n-1个值和第n-2个值的和相加就等于第n个的值
            sum = two + one;
            //把第n-1个的值赋值给第n-2个的
            two = one;
            //把第n个的值赋值给第n-1
            one = sum;
        }
        return sum;
    }