Java——斐波那契数列

题目链接

牛客在线oj题——斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足
Java——斐波那契数列_第1张图片
的数列
数据范围:1≤n≤40
要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法

输入描述:
一个正整数n

返回值描述:
输出一个正整数。

题目示例

示例1

输入:
4

返回值:
3

说明:
根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。

示例2

输入:
1

返回值:
1

示例3

输入:
2

返回值:
1

思路一

这道题是明显可以通过递归的方式完成的,fib(n) = fib(n - 1) + fib(n - 2),边界条件是当n等于2时,fib(2) = 1,当n 等于1或者0时,fib(n) = n;

思路一完整代码

public class Solution {
    public int Fibonacci(int n) {
         if(n == 0 || n == 1){
             return n;
         }
         if(n == 2){
             return 1;
         }
         return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

思路二

由于递归消耗栈帧,而这道题中每一次递归运算都要递归到fib(2)以下,因此如果输入的n超过40左右,输出的速度就肉眼可见的慢了
Java——斐波那契数列_第2张图片
从上往下求,每求一个数字就需要重复大量的计算,我们可以从下往上求fib(n - 2) + fib(n - 1) = fib(n),可以将所有的斐波那契数存储在数组中,直接用arr[n] = arr[n - 2] + arr[n - 1]来计算,也可以用三个变量的迭代来计算,这里我们采用后者

解法二完整代码

public class Solution {
    public int Fibonacci(int n) {
        if(n == 0){
            return 0;
        }
        int first = 1;
        int second = 1;
        int third = 1;
        while(n - 2 > 0){
            third = first + second;
            first = second;
            second = third;
            n--;
        }
        return third;
    }
}

解法三

由于解法一中有大量的重复计算,我们可以将这些已经计算过的斐波那契数存储在哈希表中,在递归计算中先去哈希表中查看是否计算过,如果没有计算过就计算后存储在哈希表中,否则直接使用哈希表中的数据

解法三完整代码

import java.util.HashMap;
public class Solution {
    private HashMap<Integer, Integer> hashMap = new HashMap<>();

    public int Fibonacci(int n) {
         if(n == 0 || n == 1){
             return n;
         }
         if(n == 2){
             return 1;
         }
         int pre = 0;
         if(!hashMap.containsKey(n - 1)){
            pre = Fibonacci(n - 1);
            hashMap.put(n - 1, pre);
         } else {
            pre = hashMap.get(n - 1);
         }
        int ppre = 0;
        if(!hashMap.containsKey(n - 2)){
            ppre = Fibonacci(n - 2);
            hashMap.put(n - 2, ppre);
        } else {
            ppre = hashMap.get(n - 2);
        }
        return ppre + pre;
    }
}

你可能感兴趣的:(经典算法题,java,java,算法,数据结构)